我正在尝试“组合”两个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));
}
}
更新:我不再得到下面的例外了。相反,程序似乎永远运行。我改变了在&lt;中添加元素的位置。和&gt;条件。 /// 以下是我的数组列表时得到的异常: 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)
答案 0 :(得分:68)
首先删除重复项:
arrayList1.removeAll(arrayList2);
然后合并两个arrayList:
arrayList1.addAll(arrayList2);
最后,如果您愿意,请对您的arrayList进行排序:
collections.sort(arrayList1);
如果您不想对现有列表进行任何更改,请先创建其备份列表:
arrayList1Backup = new ArrayList(arrayList1);
答案 1 :(得分:29)
您可以使用ArrayList.addAll()
合并列表Collections.sort()
来对其进行排序,最后遍历生成的ArrayList以删除重复项,而不是您编写的代码。因此,汇总复杂性为O(n)+O(n*log(n))+O(n)
,相当于O(n*log(n))
。
答案 2 :(得分:12)
添加ArrayList1,ArrayList2并生成单个arraylist ArrayList3。 现在将其转换为
Set Unique_set = new HashSet(Arraylist3);
在独特的集合中,您将获得独特的元素。
注意强>
ArrayList 允许复制值。 设置不允许值重复。 希望你的问题得到解决。
答案 3 :(得分:10)
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]
答案 4 :(得分:5)
Java 8 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()
。
答案 5 :(得分:4)
也许我的嵌套for循环使用不正确?
提示:嵌套循环不适用于此问题。一个简单的for循环也不起作用。
您需要将问题可视化。
在一张纸上写下两个有序列表,用两根手指指向相应列表的元素,在你脑海中合并时逐步执行它们。然后将您的心理决策过程转换为算法,然后进行编码。
最佳解决方案只需通过两个列表。
答案 6 :(得分:4)
在第一个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);
指定新的Set以从arraylist中删除重复的条目
Set<String> setList = new LinkedHashSet<String>(comboArrayList);
comboArrayList.clear();
comboArrayList.addAll(setList);
对arraylist进行排序
Collections.sort(comboArrayList);
<强>输出强>
A
B
C
D
E
F
G
答案 7 :(得分:2)
你的第二个for循环应该有j ++而不是i ++
答案 8 :(得分:2)
我不确定为什么你当前的代码失败了(你得到的Exception是什么?),但我想指出这种方法执行O(N平方)。考虑对输入数组进行预排序(如果它们未定义为预先排序)并合并排序的数组:
http://www.algolist.net/Algorithms/Merge/Sorted_arrays
排序通常为O(N logN),合并为O(m + n)。
答案 9 :(得分:2)
以下是使用java 8的一种解决方案:
Stream.of(list1, list2)
.flatMap(Collection::stream)
.distinct()
// .sorted() uncomment if you want sorted list
.collect(Collectors.toList());
答案 10 :(得分:1)
你的嵌套for循环
for(int j = 0; j < array2.size(); i++){
是无限的,因为j总是等于零,另一方面,我会在这个循环中随意增加。当i大于plusArray.size()
时,会出现OutOfBoundaryException答案 11 :(得分:0)
您不必手动编码。问题定义恰恰是Apache Commons CollectionUtils#collate的行为。它也为不同的排序顺序重载并允许重复。
答案 12 :(得分:0)
-i
}
输出:**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);
}