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

时间:2012-03-29 00:56:39

标签: java arraylist

我正在尝试“组合”两个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)

13 个答案:

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