2013-02-19 91 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