从ArrayList中删除每个重复的元素

时间:2014-07-28 15:21:17

标签: java arraylist duplicates duplicate-removal

请在downvote之前 - 阅读问题并查看示例 - 这不重复!

我想从Java中的ArrayList中删除每个重复的元素,如下所示:

Original list: [4, 2, 2, 3, 4, 1]
Set result: [1, 2, 3, 4]
Desired result: [1, 3]

重复的明显解决方案 - 设置在这里不起作用。

我的解决方案:

        ArrayList<Integer> arrayList = new ArrayList<Integer>();
        arrayList.add(5);
        arrayList.add(1);
        arrayList.add(5);
        arrayList.add(1);
        arrayList.add(5);
        arrayList.add(2);
        arrayList.add(3);

        ArrayList<Integer> temp = new ArrayList<>(arrayList);

        for(Integer number : new HashSet<Integer>(arrayList)){
            temp.remove(number);
        }

        arrayList.removeAll(temp);

任何更聪明/更聪明的解决方案?

3 个答案:

答案 0 :(得分:3)

有很多方法可以做你想做的事。这是一个(其中T是您现有List存储的类型):

  1. 分配Map<T, Integer>。整数将用于存储项目在列表中显示的次数。
  2. 对列表进行迭代。在地图中查找每个项目。如果它不存在,则将其计数为1。如果它已经存在于地图中,请递增计数并放回新计数。
  3. 迭代地图中的条目以提取重复数据删除列表。您不会包含任何值大于一的条目。
  4. 即使对于大型列表,这种方法也会很快。

答案 1 :(得分:2)

或者,您也可以将频率检查为删除。 Collections.frequency(arrayList, number)

public static void main(String[] args) {
    ArrayList<Integer> arrayList = new ArrayList<Integer>();
    arrayList.add(5);
    arrayList.add(1);
    arrayList.add(5);
    arrayList.add(1);
    arrayList.add(5);
    arrayList.add(2);
    arrayList.add(3);

    ArrayList<Integer> unique = new ArrayList<>();

    for (Integer number : arrayList) {
        if (Collections.frequency(arrayList, number) == 1) {
            unique.add(number);
        }
    }

    System.out.println(unique);
}

答案 2 :(得分:1)

您可以使用循环检查ArrayList中的重复项,然后使用ArrayList上的remove()删除元素。

请参阅以下内容:

{
    ArrayList list;
    // ...
    while(true)
        for(final Integer o : list) {
            if(list.indexOf(o) != list.lastIndexOf(o)) {
                while(list.remove(o));
                continue;
            }
            break;
        }
}

更改native更好的方法是使用临时Set来存储要删除的对象:

{
    ArrayList list;
    TreeSet<Integer> set = new TreeSet<>(); // Use your Set!
    // ...
    for(final Integer o : list)
        if(list.indexOf(o) != list.lastIndexOf(o))
            set.add(o);
    for(final Integer o : set)
        while(list.remove(o));
}