2014-10-01 43 views
7

我有2个带有数据的文本文件。我正在用BufferReader读取这些文件,并将每个文件一列的数据放在List<String>中。如何获得列表中的唯一值

我在每一个中都有重复的数据,但是我需要在第一个List中有唯一的数据来对付第二个List中的重复数据。

如何从List获得唯一值?

+0

如果列表已经包含()它,不要添加重复值? – 2014-10-01 22:59:44

回答

7

ArrayList转换为HashSet

List<String> listWithDuplicates; // Your list containing duplicates 
Set<String> setWithUniqueValues = new HashSet<>(listWithDuplicates); 

如果由于某种原因,您想要将设置转换回列表后,您可以,但很有可能没有必要。

List<String> listWithUniqueValues = new ArrayList<>(setWithUniqueValues); 
+0

为你答案很多。 – 2014-10-01 23:06:17

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分配给一个列表,集,哈希表或TreeSet中。 任何人都可以解释理论上的差异,并在实践中最好的使用tu? thnks为你的时间伙计。

+0

Java API文档为每个集合类和接口提供详细的文档。 [列表上的维基百科页面](http://en.wikipedia.org/wiki/List_(abstract_data_type))也提供了有关其他集合类型的页面的概述和链接。 – 2014-10-01 23:18:40

13

它可以通过使用一个完成一行的中间Set

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

在java中8,在一个流使用distinct()

List<String> list = list.stream().distinct().collect(Collectors.toList()); 

可替换地,在不使用一个列表所有;只需从集合的起始处使用Set(如HashSet),您只需保存唯一值。

+0

我认为你的意思是:'list.stream()。distinct()。collect(Collectors.toList());' – MoGa 2017-12-17 09:15:03

+0

@MoGa我很年轻,愚蠢和热爱。谁能怪我这样愚蠢? (谢谢 - 代码更正) – Bohemian 2017-12-17 11:30:32

+0

大声笑你的代码实际上指出我正确的方向;)干杯 – MoGa 2017-12-17 21:04:46

0

在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方法。

相关问题