【问题标题】:Dynamic array merge in java [closed]java中的动态数组合并[关闭]
【发布时间】:2015-03-07 19:03:18
【问题描述】:

我有两个这样的数组。

String[] arr1 = { "1", "2", "3" };
String[] arr2 = { "111", "222", "333", "444", "555", "666", "777", "888", "999" };

我想使用索引值的组合来合并这两个数组。

我的输入将是两个整数值(2:3 比例),像这样

int firstArray = 2;    //input value
int secondArray = 4;   //input value

合并后,所有值将存储在单个列表中。现在我需要这样的输出。

 1
 2
 111
 222
 333
 444
 3
 1
 555
 666
 777
 888
 2
 3    
 999
 111
 222
 333

循环应该一直运行到哪个数组长度很大,并从两个数组中检索所有值。

如果数组长度改变了,那么输出比率也应该改变

String[] arr1 = { "1", "2", "3", "4", "5", "6", "7", "8" };
String[] arr2 = { "111", "222", "333", "444", "555" };

int firstArray = 3;    //input value
int secondArray = 2;   //input value

输出:

1
2
3
111
222
4
5
6
333
444
7
8
1
555
111

所以条件是输出应该包含数组中的所有值,直到数组的最大长度和输出应该以第二个比率完成(第二个输入值 - secondArray)。

提前致谢。

String[] arr = mergeArrays(arr1, arr2, 2, 3);

        System.out.println("Ratio 2:3");

        for (String str : arr) {
            System.out.println(str);
        }

private static String[] mergeArrays(String[] arr1, String[] arr2, int firstArray, int secondArray) {
        final String[] ret = new String[arr1.length + arr2.length];

        for (int j = 0, k = 0; j < arr1.length || k < arr2.length;) {
            if (j < arr1.length) {
                do {
                    ret[j + k] = arr1[j];
                    j++;
                } while (j < arr1.length && (j % firstArray != 0 || k == arr2.length));
            }
            if (k < arr2.length) {
                do {
                    ret[j + k] = arr2[k];
                    k++;
                } while (k < arr2.length && (k % secondArray != 0 || j == arr1.length));
            }
        }

        return ret;
    }

我从这个solution尝试过

但我无法正确输出

【问题讨论】:

    标签: java arrays list sorting linked-list


    【解决方案1】:

    这应该可行:

    public static void main(String args[]) throws IOException {
        int[] array1 = {1, 2, 3, 4, 5, 6, 7, 8};
        int[] array2 = {11, 22, 33};
    
        int firstArray = 3;
        int secondArray = 5;
    
        for (int a1 = 0, a2 = 0; ;) {
            for (int i = 0; i < firstArray; i++)
                System.out.println(array1[a1++ % array1.length]);
            if (a1 >= array1.length && a2 >= array2.length)
                break;
            for (int i = 0; i < secondArray; i++)
                System.out.println(array2[a2++ % array2.length]);
            if (a1 >= array1.length && a2 >= array2.length)
                break;
        }
    }
    

    如果您想在视频上生成一个新数组来代替打印结果,只需声明一个ArrayList 并使用add() 方法向其中添加元素:

    public static void main(String args[]) throws IOException {
        int[] array1 = {1, 2, 3, 4, 5, 6, 7, 8};
        int[] array2 = {11, 22, 33};
    
        int firstArray = 3;
        int secondArray = 5;
    
        ArrayList<Integer> output = new ArrayList();
    
        for (int a1 = 0, a2 = 0; ;) {
            for (int i = 0; i < firstArray; i++)
                output.add(array1[a1++ % array1.length]);
            if (a1 >= array1.length && a2 >= array2.length)
                break;
            for (int i = 0; i < secondArray; i++)
                output.add(array2[a2++ % array2.length]);
            if (a1 >= array1.length && a2 >= array2.length)
                break;
        }
    
        for (int i = 0; i < output.size(); i++)
            System.out.println(output.get(i));
    }
    

    如果你想创建一个函数:

    public ArrayList<Integer> merge(int[] array1, int[] array2, int firstArray, int secondArray) {
    
        ArrayList<Integer> output = new ArrayList();
    
        for (int a1 = 0, a2 = 0; ;) {
            for (int i = 0; i < firstArray; i++)
                output.add(array1[a1++ % array1.length]);
            if (a1 >= array1.length && a2 >= array2.length)
                break;
            for (int i = 0; i < secondArray; i++)
                output.add(array2[a2++ % array2.length]);
            if (a1 >= array1.length && a2 >= array2.length)
                break;
        }
    
        return output;
    }
    

    如果您不想返回 ArrayList,只需将其转换为 int[]

    【讨论】:

    • 您好 Giulio,感谢您的支持。您的输出几乎是正确的,但缺少一个逻辑输出将以第二个比率(sencondArray)结束。
    • 我不明白,尝试更好地解释问题所在。
    【解决方案2】:

    我使用List 代替数组,因为我认为您无法真正预测结果数组的长度。

    public static <T> List<T> merge(List<T> l1, List<T> l2, int r1, int r2) {
        List<T> result = new ArrayList<T>();
    
        int index1 = 0;
        int index2 = 0;
    
        while (index1 < l1.size() || index2 < l2.size()) {
            for (int i = 0; i < r1; ++i)
                result.add(l1.get((index1 + i) % l1.size()));
            index1 += r1;
            if (index2 < l2.size()) {
                for (int i = 0; i < r2; ++i)
                    result.add(l2.get((index2 + i) % l2.size()));
                index2 += r2;
            }
    
        }
        return result;
    }
    

    测试代码:

    String[] arr1 = { "1", "2", "3" };
    String[] arr2 = { "111", "222", "333", "444", "555", "666", "777",
                "888", "999" };
    
    System.out.println(merge(Arrays.asList(arr1), Arrays.asList(arr2), 2, 4));
    

    输出:

    [1, 2, 111, 222, 333, 444, 3, 1, 555, 666, 777, 888, 2, 3, 999, 111, 222, 333]
    

    【讨论】:

    • 嗨 Niels,感谢您的支持。您的输出几乎是正确的,但缺少一个逻辑输出将以第二个比率(sencondArray)结束。
    • 嗨 Neils,从您的代码中删除 if (index2 后,我得到了我期望的输出
    猜你喜欢
    • 2014-03-31
    • 1970-01-01
    • 2014-08-27
    • 2020-09-05
    • 1970-01-01
    • 2018-11-12
    • 2015-02-22
    • 2013-10-14
    • 1970-01-01
    相关资源
    最近更新 更多