删除Map或list中的指定元素

  1. 删除指定元素

删除指定元素

​ 之前说过在通过iterator遍历的时候不能删除元素,会报ConcurrentModificationException,因为在iterator中一般会设置一个标识来判断循环时是原数据结构是否被更改了。

​ 比如想把map中value为1的全部删除掉,如果用下面这种的话,直接remove掉可行不??????

for (Map.Entry<Integer,Integer> entry:map.entrySet()){
            if (entry.getValue()==1){
                map.remove(entry.getKey());
            }
        }
---------------------------------------------------------------------------------
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)
    at java.util.HashMap$EntryIterator.next(HashMap.java:1476)
    at java.util.HashMap$EntryIterator.next(HashMap.java:1474)

​ 很明显不行,for each语句其实就是通过iterator来做的,Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则,Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。那怎么样才能删除呢?

​ 其实直接用iterator的remove函数就可以了, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。

Iterator<Map.Entry<Integer,Integer>> iterator=map.entrySet().iterator();         
while (iterator.hasNext()){             
         Map.Entry<Integer, Integer> entry= iterator.next();
         int value=entry.getValue();             
         if (value==1){                 
              iterator.remove();             
         } 
}
-----------------------------------------------------------------------------

​ 同理,list删除元素也是一样的道理。

​ 发现了一个宝藏,Collection里实现了一个方法,removeIf(),原理一样的,只要实现Collection接口的可以直接用这个函数,比如List,Queue和Set。

default boolean removeIf(Predicate<? super E> filter) {
        Objects.requireNonNull(filter);
        boolean removed = false;
        final Iterator<E> each = iterator();
        while (each.hasNext()) {
            if (filter.test(each.next())) {
                each.remove();
                removed = true;
            }
        }
        return removed;
    }

​ Predicate是在package java.util.function包中,注解是@FunctionalInterface,是个函数式编程的接口。

​ 像上面的就可以用list.removeIf(integer -> integer == 1);


本网站发布的一切文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请联系邮箱:1194325527@qq.com处理

目录
×

给作者杯卡布奇诺

github