从列表中删除重复元素

5

我已经开发了一个数组列表。

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

list.add("1");
list.add("2");
list.add("3");
list.add("3");
list.add("5");
list.add("6");
list.add("7");
list.add("7");
list.add("1");
list.add("10");
list.add("2");
list.add("12");

但是,如上所示,它包含许多重复的元素。我想从该列表中删除所有重复项。为此,我认为首先需要将列表转换为集合。

Java是否提供将列表转换为集合的功能?还有其他删除列表中重复项的工具吗?


2
你一开始为什么不创建一个Set呢? - Patrick
1
Set<String> set = new HashSet<String>(list); - Subhrajyoti Majumder
可能是重复的问题:如何从ArrayList中删除重复元素? - Raedwald
你应该接受一个答案。 - tgabb
8个回答

25

你可以使用以下方式将它转换为Set:

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

或者您可以使用以下方法将其转换为集合再转回列表:

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

不过,这两种方法都很可能无法保证元素的顺序。为了保持顺序,您可以在迭代时使用 HashSet 作为辅助结构:

List<String> list2 = new ArrayList<String>();
HashSet<String> lookup = new HashSet<String>();
for (String item : list) {
    if (lookup.add(item)) {
        // Set.add returns false if item is already in the set
        list2.add(item);
    }
}
list = list2;

对于重复值,仅第一个出现的值会在结果中出现。如果你只想要最后一次出现的值,那就更难了。我会先反转输入列表,再进行上述操作,最后再反转结果。


嗨Ted,非常感谢。你能否稍微解释一下list = new ArrayList<String>(new HashSet<String>(list)); 这段代码吗?首先我们将list转换为set,然后再尝试将set转换回list。 - dghtr
1
将集合转换为“Set”可以消除重复项。 转换回“List”会给您一个具有固定(但未确定)顺序的集合,您可以通过索引访问元素。 如果您只需要一个集合(没有任何特定顺序--包括在未更改集合的不同迭代上可能有不同的顺序),则只需选择第一选项。 如果您需要保留原始顺序,请选择第三个选项。 - Ted Hopp

9
这是:

Set<String> set = new HashSet<String>();
set.addAll(list);
list.clear();
list.addAll(set);

@Abshiek,谢谢,所以最终Java为我们提供了将列表转换为集合的功能。 - dghtr
4
实际上,Java提供了一个构造函数来用任何其他的Collection初始化一个Collection,因此它甚至更加通用 :) - Jack

6
Java 8的方法: list.stream().distinct().collect(Collectors.toList()); 完成 :)

尽管您已经删除了重复项,但仍然返回一个List。这回答了基本问题,但原帖的评论者表示他期望得到有关“将列表转换为集合”的答案。 - YoYo
1
如果想要Set,你可以在最后使用Collectors.toSet()而不是.toList() - Ali Saeed

3
如果您需要保留元素的顺序,则应使用LinkedHashSet而不是HashSet。
Set<String> mySet = new LinkedHashSet<String>(list);

1

只需使用普通构造函数:

ArrayList<T> yourList;
HashSet<T> set = new HashSet<T>(yourList);

你将会看到一个新的视图,其中重复项已被删除,但是你将失去排序。这在目前为止发布的每个答案中都是正确的。为了保持排序,你应该迭代现有列表,并仅在它是重复项时删除元素(可以使用集合来检查是否已经找到元素)。


0

你可以首先使用一个集合或将其转换为集合:

 Set<String> set = new TreeSet<String>(list);

0

以下是您可以实现此目标的一些方法。

使用Java 8:

List<String> distinctLambda=originalList.stream()
           .distinct().collect(Collectors.toList());
 System.out.println(distinctLambda);

使用 Set:

Set<String> distinctSet=new HashSet<>(originalList);
        System.out.println(distinctSet);

普通的for循环

List<String> distinctNewList=new ArrayList<>();
        for (String temp:originalList) {
            if(distinctNewList.size()==0){
                distinctNewList.add(temp);
                continue;
            }

            if(!distinctNewList.contains(temp)){
                distinctNewList.add(temp);
            }
        }

        System.out.println(distinctNewList);

这是您的数据集:

ArrayList<String> originalList = new ArrayList<>();
        originalList.add("1");
        originalList.add("2");
        originalList.add("3");
        originalList.add("3");
        originalList.add("5");
        originalList.add("6");
        originalList.add("7");
        originalList.add("7");
        originalList.add("1");
        originalList.add("10");
        originalList.add("2");
        originalList.add("12");

0
package com.scjp.dump.test;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

public class ArrayListTest {

    public static void main(String[] args) {

        List<Integer> mylist2 = new ArrayList<Integer>();

        List<Integer> mylist1 = new ArrayList<Integer>();
        mylist1.add(3);
        mylist1.add(3);
        mylist1.add(5);
        mylist1.add(9);
        mylist1.add(2);
        mylist1.add(5);
        mylist1.add(5);
        mylist1.add(3);
        mylist1.add(3);
        mylist1.add(3);
        mylist1.add(9);
        mylist1.add(56);
        System.out.println(mylist1);
        Iterator<Integer> itr1 = mylist1.listIterator();
        while (itr1.hasNext()) {
            Integer itn1 = (Integer) itr1.next();
            if (mylist2.contains(itn1) == false)
                mylist2.add(itn1);
        }

        System.out.println(mylist2);

    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接