组合ArrayList没有重复

时间:2014-10-28 18:56:50

标签: java arraylist

import java.util.ArrayList;
import java.util.Collections;

public class SmartCombining {
    public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<Integer>();
        ArrayList<Integer> list2 = new ArrayList<Integer>();

        Collections.addAll(list1, 4, 3);
        Collections.addAll(list2, 5, 10, 4, 3, 7);

        smartCombine(list1, list2);
        System.out.println(list1);
        System.out.println(list2);
    }

    public static void smartCombine(ArrayList<Integer> first,
            ArrayList<Integer> second) {
        first.addAll(second);
    }    
}

所以,我想将两个列表合并为一个,但如果第二个列表包含第一个列表,则不会添加。到目前为止,我的方法将它们全部加在一起。

7 个答案:

答案 0 :(得分:4)

嗯,一种方法是迭代第二个列表,同时检查第一个列表中是否存在每个元素。如果没有,请添加它。

public static void smartCombine(ArrayList<Integer> first, ArrayList<Integer> second) {
     for(Integer num : second) {      // iterate through the second list
         if(!first.contains(num)) {   // if first list doesn't contain current element
             first.add(num);          // add it to the first list
         }
     }
}  

另一种方法是将值保存在一个集合(如HashSet)中,不允许任何重复。然后你可以将它们组合起来:

first.addAll(second);

你可以做的另一种方法是先删除第二个列表中存在的第一个列表中的所有元素(那些将被复制的元素)。然后将第二个列表的所有元素添加到第一个列表中。

public static void smartCombine(ArrayList<Integer> first, ArrayList<Integer> second) {
    first.removeAll(second); // remove elements that would be duplicated
    first.addAll(second);    // add elements from second list
}   

答案 1 :(得分:3)

简单,无脑的解决方案:

Set<Integer> joinedSet = new HashSet<Integer>();
joinedSet.addAll(list1);
joinedSet.addAll(list2);

答案 2 :(得分:2)

使用Set,它是为此目的而创建的。根据{{​​1}}方法,Set不能包含2个相同的元素。

equals

使用Set<Integer> list1 = new HashSet<Integer>(); Set<Integer> list2 = new HashSet<Integer>(); ArrayList方法的组合是一个反模式。

答案 3 :(得分:1)

删除重复项,然后合并两个列表:

list1.remove(list2);
list1.addAll(list2);

如果您不想更改原始列表,请先创建备份:

list1BP = new ArrayList(list1);

另一种方法是使用HashSet,请参阅其他答案。

答案 4 :(得分:1)

有两种简单的方法可以组合两个列表,并且将删除重复。

1)通过创建ArrayList的等效HashSet 对象,可以获得输出的第一个也是最简单的方法。由于 HashSet不允许重复。

public static void main(String[] args) {
    ArrayList<Integer> list1 = new ArrayList<Integer>();
    ArrayList<Integer> list2 = new ArrayList<Integer>();

    Collections.addAll(list1, 4, 3);
    Collections.addAll(list2, 5, 10, 4, 3, 7);
    System.out.println(smartCombine(list1, list2));
}
public static HashSet<Integer> smartCombine(ArrayList<Integer> first, ArrayList<Integer> second) {
    first.addAll(second);
    HashSet<Integer> hs = new HashSet<Integer>(first);
    return hs;

2)使用高级 for循环还有另一种方法。迭代第二个列表并检查当前元素是否不在第一个列表中,然后添加当前元素。

public static void main(String[] args) {
    ArrayList<Integer> list1 = new ArrayList<Integer>();
    ArrayList<Integer> list2 = new ArrayList<Integer>();
    Collections.addAll(list1, 4, 3);
    Collections.addAll(list2, 5, 10, 4, 3, 7);
    smartCombine(list1, list2);
    System.out.println(list1);
}
public static void smartCombine(ArrayList<Integer> first, ArrayList<Integer> second) {
    for (Integer num : second) {
        if (!first.contains(num)) {
            first.add(num);
        }
    }
}

注意:第二种方式只有在第一个列表没有重复时才能正常工作。

答案 5 :(得分:0)

contains(Object)

中使用ArrayList方法
public static void smartCombine(ArrayList<Integer> first,
        ArrayList<Integer> second) {
    for(Integer i :second){
       if(!first.contains(i)) { // if first list doesn't contain this item, add item to the first list.
          first.add(i);
       }
    }
}

答案 6 :(得分:0)

您是否尝试过ArrayList.addAll()

看看这个java doc

作为指针,这将无法处理可以使用Set

轻松删除的重复项