簡體   English   中英

在Java中將兩個arrayLists合並到一個新的arrayList中,沒有重復項和順序

[英]Merging two arrayLists into a new arrayList, with no duplicates and in order, in Java

我正在嘗試“組合”兩個arrayLists,生成一個新的arrayList,其中包含兩個組合arrayLists中的所有數字,但沒有任何重復元素,它們應該按順序排列。 我在下面提出了這個代碼。 我經歷過它,這對我來說很有意義,但我不確定我是否可以使用<或>來比較get(i)在arrayLists中。 我將array1中的所有元素添加到plusArray中。 然后我將通過plusArray並將其與array2進行比較,以查看arrayA的元素是否存在於plusArray中。 如果他們這樣做我什么都不做,但如果他們不這樣做,那么我試圖將它添加到正確的位置。 也許我的嵌套for循環使用不正確? 注意:ArrayLists由用戶按遞增順序排序。

     ArrayList<Integer> plusArray = new ArrayList<Integer>();
for(int i = 0; i < array1.size(); i++){
    plusArray.add(array1.get(i));
}

for(int i = 0; i < plusArray.size(); i++){
    for(int j = 0; j < array2.size(); j++){

    if(array2.get(j) < plusArray.get(i)){
        plusArray.add(i,array2.get(j));
    }
    else if(plusArray.get(i).equals(array2.get(j))){
        ;
    }
    else if(array2.get(j) > plusArray.get(i)){
        plusArray.add(i, array2.get(j));
    }

}

更新:我不再得到下面的例外。 相反,程序似乎永遠運行。 我更改了<和>條件中添加元素的位置。 ///這是我的數組列表得到的異常:IntSet 1:{1 2} IntSet 2:{1 3 4}

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.ArrayList.grow(Unknown Source)
at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
at IntSet.plus(IntSet.java:92)
at IntSetDriver.main(IntSetDriver.java:61)

首先刪除重復項:

arrayList1.removeAll(arrayList2);

然后合並兩個arrayList:

arrayList1.addAll(arrayList2);

最后,如果您願意,可以對您的arrayList進行排序:

collections.sort(arrayList1);

如果您不想對現有列表進行任何更改,請首先創建其備份列表:

arrayList1Backup = new ArrayList(arrayList1);

您可以使用ArrayList.addAll()來合並列表,而不是您編寫的代碼,使用Collections.sort()進行排序,最后遍歷生成的ArrayList以刪除重復項。 因此,總復雜度為O(n)+O(n*log(n))+O(n) ,其等於O(n*log(n))

添加ArrayList1,ArrayList2並生成Single arraylist ArrayList3。 現在將其轉換為

Set Unique_set = new HashSet(Arraylist3);

在獨特的設置中,您將獲得獨特的元素。
注意

ArrayList允許復制值。 Set不允許值重復。 希望你的問題得到解決。

List<String> listA = new ArrayList<String>();

    listA.add("A");
    listA.add("B");

List<String> listB = new ArrayList<String>();

    listB.add("B");
    listB.add("C");

Set<String> newSet = new HashSet<String>(listA);

    newSet.addAll(listB);
List<String> newList = new ArrayList<String>(newSet);

System.out.println("New List :"+newList);

給你新名單:[A,B,C]

Java 8 Stream API可用Stream API目的,

ArrayList<String> list1 = new ArrayList<>();

list1.add("A");
list1.add("B");
list1.add("A");
list1.add("D");
list1.add("G");

ArrayList<String> list2 = new ArrayList<>();

list2.add("B");
list2.add("D");
list2.add("E");
list2.add("G");

List<String> noDup = Stream.concat(list1.stream(), list2.stream())
                     .distinct()
                     .collect(Collectors.toList());
noDup.forEach(System.out::println);

En passant,不應該忘記distinct()使用hashCode()

在第一個arraylist中添加元素

ArrayList<String> firstArrayList = new ArrayList<String>();

firstArrayList.add("A");
firstArrayList.add("B");
firstArrayList.add("C");
firstArrayList.add("D");
firstArrayList.add("E");

在第二個arraylist中添加元素

ArrayList<String> secondArrayList = new ArrayList<String>();

secondArrayList.add("B");
secondArrayList.add("D");
secondArrayList.add("F");
secondArrayList.add("G");

在第二個arraylist中添加第一個arraylist的元素

secondArrayList.addAll(firstArrayList);

分配新的組合arraylist並添加兩個arraylists的所有元素

ArrayList<String> comboArrayList = new ArrayList<String>(firstArrayList);
comboArrayList.addAll(secondArrayList);

分配新集以從arraylist中刪除重復條目

Set<String> setList = new LinkedHashSet<String>(comboArrayList);
comboArrayList.clear();
comboArrayList.addAll(setList);

排序arraylist

Collections.sort(comboArrayList);

產量

 A
 B
 C
 D
 E
 F
 G

也許我的嵌套for循環使用不正確?

提示:嵌套循環不適用於此問題。 一個簡單的for循環也不起作用。

您需要可視化問題。

在一張紙上寫兩個有序列表,用兩根手指指向相應列表的元素,在你腦中合並時逐步執行它們。 然后將您的心理決策過程轉換為算法,然后進行編碼。

最佳解決方案通過兩個列表進行單次傳遞。

這是使用java 8的一個解決方案:

Stream.of(list1, list2)
    .flatMap(Collection::stream)
    .distinct()
    // .sorted() uncomment if you want sorted list
    .collect(Collectors.toList());

你的第二個for循環應該有j ++而不是i ++

我不確定為什么你當前的代碼失敗了(你得到的Exception是什么?),但我想指出這種方法執行O(N平方)。 考慮對輸入數組進行預排序(如果它們未定義為預先排序)並合並排序的數組:

http://www.algolist.net/Algorithms/Merge/Sorted_arrays

排序通常為O(N logN),合並為O(m + n)。

你的嵌套for循環

 for(int j = 0; j < array2.size(); i++){

是無限的,因為j總是等於零,另一方面,我會在這個循環中隨意增加。 當我大於plusArray.size()時,你得到OutOfBoundaryException

您不必手動編碼。 問題定義恰恰是Apache Commons CollectionUtils #collat​​e的行為。 它也為不同的排序順序重載並允許重復。

**Add elements in Final arraylist,**
**This will Help you sure**

import java.util.ArrayList;
import java.util.List;

public class NonDuplicateList {

public static void main(String[] args) {

    List<String> l1 = new ArrayList<String>();
    l1.add("1");l1.add("2");l1.add("3");l1.add("4");l1.add("5");l1.add("6");
    List<String> l2 = new ArrayList<String>();
    l2.add("1");l2.add("7");l2.add("8");l2.add("9");l2.add("10");l2.add("3");
    List<String> l3 = new ArrayList<String>();
    l3.addAll(l1);
    l3.addAll(l2);
    for (int i = 0; i < l3.size(); i++) {
        for (int j=i+1; j < l3.size(); j++) {
             if(l3.get(i) == l3.get(j)) {
                 l3.remove(j);
            }
        }
    }
    System.out.println(l3);
}

}

輸出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

我明白你不想使用內置函數來合並或刪除ArrayList中的重復項。 您的第一個代碼將永遠運行,因為外部for循環條件為“Always True”。 由於你要向plusArray添加元素,所以plusArray的大小隨着每次添加而增加,因此'i'總是小於它。 因此,條件永遠不會失敗,程序將永遠運行。 提示:嘗試首先合並列表,然后從合並列表中刪除重復的元素。 :)

暫無
暫無

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

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