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

Mil*_*lic 46 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));
    }

}
Run Code Online (Sandbox Code Playgroud)

更新:我不再得到下面的例外.相反,程序似乎永远运行.我更改了<和>条件中添加元素的位置.///这是我的数组列表得到的异常: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)
Run Code Online (Sandbox Code Playgroud)

小智 71

首先删除重复项:

arrayList1.removeAll(arrayList2);
Run Code Online (Sandbox Code Playgroud)

然后合并两个arrayList:

arrayList1.addAll(arrayList2);
Run Code Online (Sandbox Code Playgroud)

最后,如果您愿意,可以对您的arrayList进行排序:

collections.sort(arrayList1);
Run Code Online (Sandbox Code Playgroud)

如果您不想对现有列表进行任何更改,请首先创建其备份列表:

arrayList1Backup = new ArrayList(arrayList1);
Run Code Online (Sandbox Code Playgroud)


ieh*_*ich 29

您可以使用ArrayList.addAll()合并列表,对其Collections.sort()进行排序,最后遍历生成的ArrayList以删除重复项,而不是您编写的代码.因此O(n)+O(n*log(n))+O(n),总体复杂性等同于O(n*log(n)).


spe*_*ial 13

添加ArrayList1,ArrayList2并生成Single arraylist ArrayList3.现在将其转换为

Set Unique_set = new HashSet(Arraylist3);
Run Code Online (Sandbox Code Playgroud)

在独特的设置中,您将获得独特的元素.
注意

ArrayList允许复制值. Set不允许值重复.希望你的问题得到解决.


Dil*_*anG 12

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);
Run Code Online (Sandbox Code Playgroud)

给你 新名单:[A,B,C]


snr*_*snr 9

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);
Run Code Online (Sandbox Code Playgroud)

顺带一提,distinct()使用不能忘记hashCode()


nxh*_*oaf 7

这是使用 java 8 的一种解决方案:

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


Hir*_*tel 5

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

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

firstArrayList.add("A");
firstArrayList.add("B");
firstArrayList.add("C");
firstArrayList.add("D");
firstArrayList.add("E");
Run Code Online (Sandbox Code Playgroud)

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

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

secondArrayList.add("B");
secondArrayList.add("D");
secondArrayList.add("F");
secondArrayList.add("G");
Run Code Online (Sandbox Code Playgroud)

将第一个数组列表的元素添加到第二个数组列表中

secondArrayList.addAll(firstArrayList);
Run Code Online (Sandbox Code Playgroud)

分配新的组合数组列表并添加两个数组列表中的所有元素

ArrayList<String> comboArrayList = new ArrayList<String>(firstArrayList);
comboArrayList.addAll(secondArrayList);
Run Code Online (Sandbox Code Playgroud)

分配新的 Set 以从数组列表中删除重复的条目

Set<String> setList = new LinkedHashSet<String>(comboArrayList);
comboArrayList.clear();
comboArrayList.addAll(setList);
Run Code Online (Sandbox Code Playgroud)

排序数组列表

Collections.sort(comboArrayList);
Run Code Online (Sandbox Code Playgroud)

输出

 A
 B
 C
 D
 E
 F
 G
Run Code Online (Sandbox Code Playgroud)