如何在列表中获取唯一值

16

我有两个包含数据的文本文件。我使用BufferReader读取这些文件,并将每个文件中一列的数据放入一个List<String>中。

这两个列表中都有重复的数据,但是我需要在第一个List中获取唯一的数据来与第二个List中的重复数据进行对比。

如何从List中获取唯一值?


如果列表已经contains()该值,则不要添加重复的值。 - Elliott Frisch
4个回答

24

可以通过使用一个中间Set在一行上完成:

List<String> list = new ArrayList<>(new HashSet<>(list));
在Java 8中,对流使用distinct()方法:
List<String> list = list.stream().distinct().collect(Collectors.toList());

另外,可以不使用列表;而是从一开始就使用集合(如 HashSet)来存储您只想保存唯一值的集合。


1
我认为你的意思是:list.stream().distinct().collect(Collectors.toList()); - MoGa
@MoGa 我年轻、愚蠢而且热恋。谁能责怪我如此愚蠢呢?(感谢 - 代码已纠正) - Bohemian
哈哈,你的代码实际上指引了我正确的方向;)干杯! - MoGa

11

ArrayList 转换为 HashSet

List<String> listWithDuplicates; // Your list containing duplicates
Set<String> setWithUniqueValues = new HashSet<>(listWithDuplicates);
如果出于某些原因,您希望在之后将集合转换回列表,那么您可以这样做,但很可能没有这种需要。
List<String> listWithUniqueValues = new ArrayList<>(setWithUniqueValues);

非常感谢你的回答。 - Junior Fulcrum

3

在Java 8中:

     // List with duplicates
     List<String> listAll = Arrays.asList("A", "A", "B", "C", "D", "D");

     // filter the distinct 
     List<String> distinctList = listAll.stream()
                     .distinct()
                     .collect(Collectors.toList());

    System.out.println(distinctList);// prints out: [A, B, C, D]

这也适用于对象,但是您可能需要调整equals方法。


0

我刚刚意识到一个解决方案,可能对其他人有帮助。 首先,将使用BufferReader填充重复的值。

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

为了提取唯一值,我只需创建一个新的ArrayList,如下所示:

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

    for(String s : first) {
        if(!otherList.contains(s))
            otherList.add(s);
    }

很多互联网上的帖子都在讨论将我的ArrayList分配给List、Set、HashTable或TreeSet。有人能解释一下理论上的区别以及实践中哪一个最好用吗?谢谢大家的时间。

Java API文档为每个集合类和接口提供了详细的文档。列表(抽象数据类型)的维基百科页面也提供了概述和其他集合类型页面的链接。 - Robby Cornelissen

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