posts - 54,  comments - 1,  trackbacks - 0

项目中的问题: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)  编辑  收藏 所属分类: 开发手记

FeedBack:
# re: 剔除ArrayList中的重复值
2008-08-26 14:01 | nf
根本不好用  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 

蜀中人氏,躬耕于珠海

<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿(2)

随笔分类(71)

随笔档案(54)

博客

文档

站点

论坛

搜索

  •  

积分与排名

  • 积分 - 50261
  • 排名 - 981

最新评论

阅读排行榜