2014-10-01 62 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方法。