2012-04-29 219 views
3

我開發了一個數組列表。刪除列表中的重複元素

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 2012-04-29 08:31:15

+1

Set Set = new HashSet (list); – 2012-04-29 08:33:53

+0

可能的重複[如何從ArrayList中刪除重複元素?](http://stackoverflow.com/questions/203984/how-do-i-remove-repeated-elements-from-arraylist) – Raedwald 2015-03-05 21:49:04

回答

9

此:

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

@Abshiek,謝謝,所以最終Java提供了將列表轉換爲集合的功能。 – dghtr 2012-04-29 08:33:16

+4

@ user1351820其實Java提供了一個構造函數來初始化一個'Collection'與任何其他的'Collection',所以它甚至更廣泛:) – Jack 2012-04-29 08:34:34

0

您可以在第一時間使用一組或轉換成它:

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

可以轉換成套裝搭配:

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; 

在重複的情況下,只有第一次出現將出現在結果中。如果你只想要最後一次出現,那是一個更加棘手的問題。我將通過反轉輸入列表來解決這個問題,應用上面的內容,然後反轉結果。

+0

嗨特德,非常感謝你能解釋一下list = new ArrayList (new HashSet (list)) ;首先我們將列表轉換爲一個集合,然後嘗試將集合轉換回列表。 – dghtr 2012-04-29 08:37:38

+1

@ user1351820 - 轉換爲「Set」消除重複。轉換回「List」會爲您提供一個固定(但未確定)順序的集合,您可以通過索引訪問元素。如果你所需要的只是一個集合(沒有任何特定的順序 - 包括對不變的集合的不同迭代可能會有不同的順序),那麼就去第一個選項。如果您需要保留原始訂單,請與第三個訂單一起進行。 – 2012-04-29 08:44:41

1

只需使用普通的構造函數:

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

而且你將有項目的一個新的觀點,以重複刪除,但你會失去訂單。在迄今發佈的每個答案中都是如此。爲了保持順序,你應該迭代現有的列表並刪除一個元素,只要它是重複的(可以使用set來檢查元素是否已經找到)。

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); 

    } 

} 
3

如果您需要保留的元素,然後使用順序,而不是HashSet的

Set<String> mySet = new LinkedHashSet<String>(list); 
3

的Java 8 LinkedHashSet方式: list.stream().distinct().collect(Collectors.toList());

做:)

+0

儘管您刪除了重複項,但您仍然會返回一個「List」。這回答了基本問題,但原始的海報評論他期望得到關於「將列表轉換爲集合」的答案。 – YoYo 2016-09-07 22:40:42

+1

如果需要設置,您可以在末尾執行'Collectors.toSet()'而不是'.toList()'。 – 2016-09-15 20:50:20