将两个arrayLists合并成一个新的arrayList,在Java中没有重复和按顺序

我想“结合”两个arrayLists,产生一个新的arrayList,其中包含两个组合的arrayLists中的所有数字,但没有任何重复的元素,他们应该按顺序。 我想到了下面的代码。 我运行它,它对我来说是有道理的,但林不知道我是否可以使用<或>比较arrayLists中的get(i)。 我将array1中的所有元素添加到plusArray中。 然后,我正在通过plusArray并将其与array2进行比较,以查看是否有任何array2的元素存在于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)); } } 

更新:我没有得到下面的例外。 相反,程序似乎永远运行。 我改变了在<和>条件中添加元素的位置。 ///下面是我在数组列表时遇到的exception: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) 

您可以使用ArrayList.addAll()来合并列表, Collections.sort()进行sorting,最后遍历生成的ArrayList以删除重复项。 因此,合计复杂度为O(n)+O(n*log(n))+O(n) ,相当于O(n*log(n))

首先删除重复项:

 arrayList1.removeAll(arrayList2); 

然后合并两个arrayList:

 arrayList1.addAll(arrayList2); 

最后,如果你愿意,可以对arrayList进行sorting:

 collections.sort(arrayList1); 

如果您不想在现有列表上进行任何更改,请先创build其备份列表:

 arrayList1Backup = new ArrayList(arrayList1); 

添加ArrayList1,ArrayList2并产生一个ArrayList3 ArrayList3。 现在转换成

 Set Unique_set = new HashSet(Arraylist3); 

在独特的设置你会得到独特的元素。
注意

ArrayList允许重复值。 设置不允许重复的值。 希望你的问题解决。

 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]

也许我的嵌套for循环被错误地使用?

提示:嵌套循环不能解决这个问题。 一个简单的for循环也不会工作。

你需要可视化的问题。

在一张纸上写两个有序列表,用两个手指指向各个列表的元素,当你在头脑中进行合并的时候,通过它们。 然后将你的心理决策过程转化为algorithm,然后编码。

最佳的解决scheme是通过这两个列表。

在第一个数组列表中添加元素

 ArrayList<String> firstArrayList = new ArrayList<String>(); firstArrayList.add("A"); firstArrayList.add("B"); firstArrayList.add("C"); firstArrayList.add("D"); firstArrayList.add("E"); 

在第二个数组列表中添加元素

 ArrayList<String> secondArrayList = new ArrayList<String>(); secondArrayList.add("B"); secondArrayList.add("D"); secondArrayList.add("F"); secondArrayList.add("G"); 

在第二个数组列表中添加第一个数组列表元素

 secondArrayList.addAll(firstArrayList); 

分配新的组合数组列表,并添加来自数组列表的所有元素

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

分配新的设置从ArrayList删除重复的条目

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

排列数组列表

 Collections.sort(comboArrayList); 

产量

  A B C D E F G 

你的第二个循环应该有j ++而不是i ++

我不知道为什么你当前的代码失败(你得到了什么样的exception?),但我想指出这种方法执行O(N平方)。 考虑对input数组进行预先sorting(如果它们没有被定义为预先sorting)并合并sorting后的数组:

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

sorting通常是O(N logN),合并是O(m + n)。

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()

你的嵌套for循环

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

是无限的,因为j总是等于零,另一方面,我会在这个循环中随意增加。 当我大于plusArray.size()时,你会得到OutOfBoundaryException

 **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循环条件是“永远是真的”。 既然你正在向plusArray添加元素,所以plusArray的大小随着每个加法而增加,因此'i'总是小于它。 因此,条件永远不会失败,程序将永远运行。 提示:尝试首先合并列表,然后从合并列表中删除重复的元素。 🙂

你不必手动编码。 问题定义恰恰是Apache Commons CollectionUtils#collat​​e的行为。 它也是重载的不同的sorting顺序,并允许重复。