[英]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 #collate的行為。 它也為不同的排序順序重載並允許重復。
**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.