删除ArrayList Java中的重复元素

时间:2014-01-30 21:04:23

标签: java generics arraylist duplicates

嗨,谢谢你的阅读!我目前正在学习Java中的泛型,这正是我想要实现的目标:

我需要从ArrayList中删除重复的元素。目前,ArrayList包含整数。我想首先打印原始列表,然后在删除重复项后打印结果列表。这就是我到目前为止所拥有的。任何帮助表示赞赏!

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

    list1.add(1);
    list1.add(1);
    list1.add(1);

    list1.add(2);
    list1.add(2);
    list1.add(2);

    list1.add(3);
    list1.add(3);
    list1.add(3);

    removeDuplicates(list1);

      System.out.println("Original List with Duplicates: \n" + list1);
        System.out.println();
        //System.out.println("After removing duplicates: \n" + list2);

}

public static <E> ArrayList<E> removeDuplicates(ArrayList<E> list2){


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

    //logic to remove duplicates    


    }

    return list2;
}   

6 个答案:

答案 0 :(得分:2)

您可以将元素添加到Set集合中。如果要保留顺序,则应使用LinkedHashSet

答案 1 :(得分:1)

第一步

将您的列表转换为集合。

Set<Integer> aSet = new HashSet<Integer>(list);

第二步

将您的设置转换回列表。

list = new ArrayList<Integer>(new HashSet<Integer>(list));

为何有效

集合只能包含唯一元素。

答案 2 :(得分:0)

将ArrayList转换为Set,也许是HashSet,然后返回到ArrayList,如果你想按顺序排列数字,你可以对它进行排序(通常不保证Sets中的排序)。

HashSet hs<Integer> = new HashSet(list1);

ArrayList<Integer> uniqueList = Collections.sort(new ArrayList<Integer>(hs));

还有各种SortedSet,其中包括TreeSet

此外,您可以使用不易出错的for循环结构:

for (int i : uniqueList) {
   System.out.println(i);
}

答案 3 :(得分:0)

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

    list1.add(1);
    list1.add(1);
    list1.add(1);

    list1.add(2);
    list1.add(2);
    list1.add(2);

    list1.add(3);
    list1.add(3);
    list1.add(3);



      System.out.println("Original List with Duplicates: \n" + list1);
      System.out.println();

      list2 = removeDuplicates(list1);

      System.out.println("After removing duplicates: \n" + list2);

}

public static <E> ArrayList<E> removeDuplicates(ArrayList<E> list2){

    ArrayList<E> usedList = new ArrayList<E>();
    ArrayList<E> newList = new ArrayList<E>();

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

        E object = list2.get(i);

        if(! usedList.contains(object))
        {
            usedList.add(object);
            newList.add(object);
        }
    }

    return newList;
} 

输出(如预期):

Original List with Duplicates: 
[1, 1, 1, 2, 2, 2, 3, 3, 3]

After removing duplicates: 
[1, 2, 3]

如果您正在使用其他类型(不是int等java标准),那么您必须覆盖equals方法,因为它在ArrayList {{1}中使用方法。

答案 4 :(得分:0)

public static <E> ArrayList<E> removeDuplicates(ArrayList<E> list2){
    LinkedHashSet<E> dataSet = new LinkedHashSet<E>(list2.size());
    dataSet.addAll(list2);
    ArrayList<E> uniqueLists = new ArrayList<E>(dataSet.size());
    uniqueLists.addAll(dataSet);
    return uniqueLists;
}

答案 5 :(得分:0)

到目前为止,所有其他答案都会创建一个新列表。如果要修改列表,可以在使用辅助Set的同时遍历列表,以跟踪已经看到的所有元素。以下适用于允许删除元素的任何List(不仅仅是ArrayList):

public static <E> List<E> removeDuplicates(List<E> list){
    ListIterator<E> iter = list.listIterator();
    Set<E> seen = new HashSet<>();
    while (iter.hasNext()) {
        if (!seen.add(iter.next())) {
            // element not added--must have already been seen, so remove element
            iter.remove();
        }
    }
    return list;
}

另一种方法是将整个列表转储到Set,清除列表,然后将该组的所有元素添加回列表中。根据{{​​1}}实施情况,这可能会也可能不会保留订单。

Set

编辑:如果(根据您的评论)您希望完全删除开头不是唯一的元素,您可以修改第一种方法:

public static <E> List<E> removeDuplicates(List<E> list){
    Set<E> unique = new LinkedHashSet<>(list);
    list.clear();
    list.addAll(unique);
    return list;
}

请注意,由于我们在循环期间没有修改列表,因此我们不需要显式迭代器。

相关问题