2013-02-19 132 views
1

這裏是我的代碼:ArrayList中刪除重複

public static void deleteDuplicates(ArrayList<String> list){ 
    ArrayList<String> newList = new ArrayList<String>(); 
    HashSet<String> set = new HashSet<String>(); 

    for(int i = 0; i < list.size(); i++){ 
     set.add(list.get(i)); 
    } 

    newList.addAll(set); 
    return newList; 
} 

我此輸入如下:

1, 2, 2, 3, 4, 3, 1, 5, 5, 4, 1, 4, 5 

而且我得到的輸出是:

3, 2, 4, 1, 5 

人解釋爲什麼這是無序的?

+5

組數據結構不維持秩序的想法。但是如果你想排序,那麼你可以使用Tree Set。 – Shivam 2013-02-19 03:12:32

+3

@ShivamKalra你的意思是'HashSet',因爲['LinkedHashSet'](http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashSet.html)。 – 2013-02-19 03:16:20

+1

@LuiggiMendoza不,我的意思是任何設置的數據結構。鏈接的Hashset在內部保留鏈接列表以保持順序。 – Shivam 2013-02-19 03:18:00

回答

5

變化HashSetLinkedHashSet

的哈希表和鏈接列表實現Set接口,具有可預知的迭代順序。

還有,記得always program to an interface

public static void deleteDuplicates(List<String> list){ 
    List<String> newList = new ArrayList<String>(); 
    Set<String> set = new LinkedHashSet<String>(); 
    //rest of your code 
} 
+0

謝謝,我改變了它,它的工作。 – user123 2013-02-19 03:19:13

+1

@ user1327636不要忘記面向接口編程,而不是類實現(請檢查我的答案中提供的鏈接)。 – 2013-02-19 03:19:38

1

從HashSet的類文件引用:

它不保證爲向集合的迭代順序;在 特別是,它不能保證該訂單隨着時間的推移將保持恆定 。

1

我敢肯定有一個更effecient方式,但這裏對於n^2算法去除

public static void deleteDuplicates(ArrayList<String> list){ 
ArrayList<String> newList = new ArrayList<String>(); 

for (int i = 0; i < list.size(); i++){ 

boolean exists = false; 
String str = list.get(i); 
for (int j = 0; j < newList.size(); j++){ 
if (newList.get(j).compareTo(str)==0){ 
exists = true; 
break; 
} 
} 
if (!exists) newList.add(str); 
} 
return newList; 
} 
+0

-1請格式正確! – feralin 2013-03-27 20:00:11