【问题标题】:How to merge two arrays in Java into one sorted ArrayList?如何将Java中的两个数组合并为一个排序的ArrayList?
【发布时间】:2021-05-01 10:16:25
【问题描述】:

我有lArr(左){1,2,4,5}rArr(右){6,8,10,13},我想将它们合并到一个排序数组中,但我的代码没有按照我想要的方式运行。

private static ArrayList merge(int[] lArr, int[] rArr) {
    ArrayList mergedArray = new ArrayList();
    int i = 0;
    int j = 0;
    while (i < lArr.length && j < rArr.length) {
        if (lArr[i] < rArr[j]) {
            mergedArray.add(lArr[i]);
            i++;
        }
        // so up until here, the code runs,
        // but it never reaches the else segment.
        else {
            mergedArray.add(rArr[j]);
            j++;
        }
    }
    return mergedArray;
}

从main调用merge()方法后,只显示lArr(left array)

【问题讨论】:

标签: java arrays arraylist merge


【解决方案1】:

您应该先合并数组,然后再对数组进行排序。
您可以通过创建 ArrayList 轻松合并数组,并为数组中的每个元素将它们添加到 ArrayList,如下所示:

// just an example of values
int[] lArr = {1,2,8};
// just an example
int[] rArr = {-7,54,9,34,27};
ArrayList<Integer> mergedList = new ArrayList<Integer>();
// Loop through lArr and add each element to mergedList
for(int element : lArr) mergedList.add(element);
// Loop through rArr and add each element to mergedList
for(int element : rArr) mergedList.add(element);

现在您可以使用Collections.sort(list, comparator) 对列表进行排序,如下所示:

Collections.sort(mergedList, new Comparator<Integer>() {
   // A comparator compares two value (logic)
   // This function needs to return 1 if a > b and -1 if b < a
   // and if a = b then 1 or -1 won't change anything
   public int compare(Integer a, Integer b){
      if(a > b) return 1;
      return -1;
   }
});

【讨论】:

    【解决方案2】:

    您可以使用streams 合并和排序两个数组:

    public static void main(String[] args) {
        int[] arr1 = {5, 2, 3, 4, 1};
        int[] arr2 = {2, 1, 3, 4, 5};
        ArrayList<Integer> list = merge(arr1, arr2);
    
        System.out.println(list);
        // [1, 1, 2, 2, 3, 3, 4, 4, 5, 5]
    }
    
    private static ArrayList<Integer> merge(int[] lArr, int[] rArr) {
        return Stream.of(lArr, rArr)
                .flatMapToInt(Arrays::stream)
                .sorted()
                .collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
    }
    

    您可能想要添加自定义比较器并使用varargs

    public static void main(String[] args) {
        int[] arr1 = {5, 2, 5, 4, 1};
        int[] arr2 = {2, 1, 3, 4, 3};
        ArrayList<Integer> list =
                merge(Comparator.reverseOrder(), arr1, arr2);
    
        System.out.println(list);
        // [5, 5, 4, 4, 3, 3, 2, 2, 1, 1]
    }
    
    private static ArrayList<Integer> merge(
            Comparator<Integer> comparator, int[]... arrays) {
        return Stream.of(arrays)
                .flatMapToInt(Arrays::stream)
                .boxed()
                .sorted(comparator)
                .collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-28
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多