Hashset删除部分数据

转自:http://a455360448201209214217.iteye.com/blog/1888762

hashset是单列的数据,hashmap,hashtable都是都是双列的数据,有key和value

因为需要获取id,但首次读取id的时候只读取了前五十行(1000id),不要重复的id值。本打算从51行开始读剩余的id,但是会和前五十行id重复,读取文件文件所有行中的id值,并删除前五十行中已经获取的id值。本以为直接删除hashset中前(1000id),但是因为hashset中的数据时无序的,所以前五十行中的1000id值,并不是新的set中的前一百行。

如果你需要得到一个有序的结果你就应该使用TreeMap,TreeMap中的是先加入的在前边,是有序的。

此时,需要删除Hashset中的一些数据,但是直接删除的时候,使用如下方法会报错

Exception in thread "main" java.util.ConcurrentModificationException

错误方法:

if(set.contains("123"))

Set.remove(123)

以上方法是不对的。

此时需要:

Iterator it = set.iterator();  

        while(it.hasNext()){ 

         String id=(String)it.next();

             int id1=Integer.parseInt(id);

         if(id1==123){

        // set.remove(id);  这种方法不对

        it.remove();    //只能使用这种方法

     }

        }  

上一步仅仅在内存中将制定的数值删除,文件中的还没有删除。所以还需要将新set中的值重新写到文件中   

        Iterator it1 = set.iterator();

     StringBuffer buffer1=new StringBuffer();

           while(it1.hasNext())

           {

                String id=(String) it1.next();

                String newline = System.lineSeparator();

                String idName=id+newline;

                buffer1.append(idName);

                        

                }

         FileUtils.writeStringToFile(sourcefile,  buffer1.toString(), false);

//参数false表明是重新写入文件,不是以追加的方法写入文件。

其实,没必要继续将所有不重复的id读取到hashset,因为数据已经不重复了,同时,如果我要是删除数据的话,使用hashset删除,需要循环很多次才可以实现,需要遍历很多次(因为有很多的id要删除,所以需要循环好多次)(删除的id要遍历,set删除id也需要遍历)。所以这样子做不好。

Iterator it = set.iterator();  

        while(it.hasNext()){ 

         String id=(String)it.next();

             int id1=Integer.parseInt(id);

         if(id1==123){    

        // set.remove(id);  这种方法不对

        it.remove();    //只能使用这种方法

     }

        }  

直接使用list删除最方便,(删除是只需要循环一次要删除的id即可)

listId.contains(str);

listId.remove(str);

直接将list读取到内存中,然后判断是否删除,这样子速度很快。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值