簡體   English   中英

如何將 Java 中的兩個 arrays 合並為一個排序的 ArrayList?

[英]How to merge two arrays in Java into one sorted ArrayList?

我有lArr (left) {1,2,4,5}rArr (right) {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)

您應該先合並 arrays 然后對數組進行排序。
您可以通過創建 ArrayList 輕松合並 arrays,對於 arrays 中的每個元素,將它們添加到 Z57A97A39435CFDFEDAZ6 中,如下所示:

// 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;
   }
});

您可以使用streams合並和排序兩個 arrays :

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM