这是我的代码:
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
有谁可以解释为什么这不正常?
答案 0 :(得分:5)
更改LinkedHashSet
的HashSet
:
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
}
答案 1 :(得分:1)
从HashSet类文档中引用:
它不保证集合的迭代顺序;在 特别是,它不保证订单将保持不变 随着时间的推移。
答案 2 :(得分: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;
}