1

这是我的代码:

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

谁能解释为什么这不正常?

4

3 回答 3

5

更改HashSetLinkedHashSet

Set 接口的哈希表和链表实现,具有可预测的迭代顺序。

另外,请记住始终对接口进行编程

public static void deleteDuplicates(List<String> list){
    List<String> newList = new ArrayList<String>();
    Set<String> set = new LinkedHashSet<String>();
    //rest of your code
}
于 2013-02-19T03:17:05.173 回答
1

引用 HashSet 类文档:

它不保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。

于 2013-02-19T03:19:08.753 回答
1

我敢肯定有一种更有效的方法,但这里有一个用于删除的 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;
}
于 2013-02-19T03:20:36.687 回答