项目中的问题:ArrayList中可能存在重复值,需要将重复值剔除掉.刚开始的想法是做一个嵌套循环,将当前值与之后的所有值比较,如果重复则将后面重复的值删除掉.但是运行后发现,由于循环中删除值后会影响到数组的索引值,所以会出现漏值和跳值的现象.
仔细想想后,觉得应该反向遍历数组,这样从后面删除元素后不会影响到前面元素的索引值,可以避免前面的问题:
// 删除ArrayList中重复元素
public static void removeDuplicate(List list) {
for (int i = 0; i < list.size() - 1; i++) {
for (int j = list.size() - 1; j > i; j--) {
if (list.get(j).equals(list.get(i))) {
list.remove(j);
}
}
}
System.out.println(list);
}
可是这样做,总觉得嵌套循环的效率很低,比较ArrayList大了以后的执行时间.又想到HashSet中是不能有又重复值的,要是能用HashSet来过滤该多好.查了下JDK的文档,发现HashSet有一个构造函数 public HashSet(Collection c),到网上一查,果然有这样做的例子(http://blog.csdn.net/doodoofish/archive/2004/05/07/17922.aspx):
// 删除ArrayList中重复元素
public static void removeDuplicate(List list) {
HashSet h = new HashSet(list);
list.clear();
list.addAll(h);
System.out.println(list);
}
//删除ArrayList中重复元素,保持顺序
public static void removeDuplicateWithOrder(List list) {
Set set = new HashSet();
List newList = new ArrayList();
for (Iterator iter = list.iterator(); iter.hasNext();) {
Object element = iter.next();
if (set.add(element))
newList.add(element);
}
list.clear();
list.addAll(newList);
System.out.println("remove duplicate" + list);
}
可以看出:向Set中即使插入重复值,也只会保留个实例.
不过,运行后发现使用循环的方法好像并不比Set过滤慢多少(1000条记录,10~20毫秒),而且某些情况下Set过滤甚至比循环还慢(最慢一次是 311毫秒:60毫秒)
posted on 2005-08-18 11:38
ZhuJun 阅读(1996)
评论(1) 编辑 收藏 所属分类:
开发手记