【问题标题】:Java, merging two arrays evenlyJava,均匀地合并两个数组
【发布时间】:2013-06-25 13:53:05
【问题描述】:

将两个不同长度的数组合并在一起以使它们均匀分布在新数组中的最佳方法是什么?

假设我有以下数组

 String[] array1 = new String[7];
 String[] array2 = new String[2];
 String[] mergedArray = new String[array1.length + array2.length];

我希望 mergeArray 具有以下元素

array1 array1 array1 array2 array1 array1 array1 array2 array1

但如果我要将数组的大小更改为

 String[] array1 = new String[5];
 String[] array2 = new String[3];
 String[] mergedArray = new String[array1.length + array2.length];

那么我希望它是

array1 array2 array1 array2 array1 array2 array1 array1

基本上,如果可以帮助每个array2 元素不应该相互接触;如果array2 的大小大于array1,则例外。

【问题讨论】:

    标签: java arrays merge


    【解决方案1】:

    我会将较大数组的大小除以较小数组的大小。获得的值将是第二个数组的元素所在的位置。

    在您的第一个示例中 - 较大数组的大小为 7,较小数组的大小为 2。所以它将是 7/2 = 3。因此,第二个数组的元素将位于位置 3 和 6合并后的数组。

    【讨论】:

      【解决方案2】:

      我同意用户 Junaid 的回答。这个想法是,您通过转义恒定数量的元素将较小数组的元素分配到较大的数组中。如果数组大小相等,则将较小数组的元素分配给较大数组的所有连续元素,这是实现,请遵循:

      String[] array1 = new String[]{"d", "e", "f", "g", "h", "j", "k", "m"};
      String[] array2 = new String[]{"a", "b", "c"};
      int l1 = array1.length;
      int l2 = array2.length;
      int sectionSize = l1 / l2 + 1;
      String[] mergedArray = new String[l1 + l2];
      String[] larger = l1 > l2 ? array1 : array2;
      String[] smaller = l1 < l2 ? array1 : array2;
      
      int j = 0, k = 0;
      for (int i = 1; i <= mergedArray.length; i++) {
          if (i % sectionSize == 0)
              mergedArray[i - 1] = smaller[j++];
          else
              mergedArray[i - 1] = larger[k++];
      }
      

      【讨论】:

      • 我真的很喜欢这种方法、可读的代码,并且考虑到任何一个数组都可能比另一个数组大。虽然,它并不适用于所有情况。首先,sectionSize 应该像 large.length/smaller.length +1 一样计算,否则当 array2 大于 array1 时它总是为 1。其次,尝试再向array2 添加两个元素,它会抛出一个IndexOutOfBoundException。不知道如何解决。
      【解决方案3】:

      一种选择是从array1 中插入array1.length / array2.length 元素,用于从array2 插入的每个元素,但这可能会在新数组的末尾留下一长串array1 元素,如果数组不均分(这意味着它们的长度比不是整数 - 长度比将被截断为整数,因此您不会插入足够的 array1 元素)。

      另一种方法是使用随机数生成器来选择要从哪个数组中选择:取rand(array1.length + array2.length),如果结果数小于array1.length,则从array1中选择,否则从array2中选择;为此,您应该更新每次迭代的长度(所以它是rand(array1.length - number_of_elements_already_removed_from_array1 + array2.length - number_of_elements_already_removed_from_array2)

      【讨论】:

        【解决方案4】:

        假设array1 中有m 个元素,array2 中有n 个元素。您要做的是为来自array1 的每个 m/n 元素添加来自array2 的元素。

        在你的第一个例子中:

        m = 7, n = 2 - 您为 array1 中的每 7/2 = 3 个元素添加了来自 array2 的元素。

        在第二个例子中:

        m = 5, n = 3 - 您为 array1 中的每 5/3 = 1 个元素添加了来自 array2 的元素。

        你可以这样做:

        int counter = array1.length/array2.length;
        int m = -1, j = 0;
        for(int i=0, c=0;i<array1.length;i++, c++) {
           m++;
           if(c == counter) {
             resArray[m] = array2[j];
             j++;
             c = 0;
             continue;
           }
           resArray[m] = array1[i];
        }
        

        【讨论】:

        • 哇,这么简单的答案。天啊,我感觉很笨。非常感谢!
        • 简单的答案并不总是那么容易得到!
        • 不幸的是,这个解决方案也不适用于例如array1.length=8 和 array2.length=5。试试看:IndexOutOfBoundsException。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-04
        • 1970-01-01
        • 2015-02-24
        • 2016-10-18
        • 2018-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多