如何在Java TreeMap中删除符合指定条件的条目?
问题根因
你当前的写法会触发ConcurrentModificationException(并发修改异常),原因是增强for循环本质是用集合迭代器遍历,遍历过程中直接调用map.remove()方法会修改集合的修改计数,和迭代器预期的计数不一致就会抛出异常。
解决方案1:使用迭代器的remove()方法(兼容所有Java版本)
迭代器自带的remove()方法会同步更新迭代器的预期修改计数,是遍历过程中删除元素的标准安全写法:
public static TreeMap<Integer, String> filterTreeMap( TreeMap<Integer, String> map, int keyFilter, char valueFilter) { Iterator<Map.Entry<Integer, String>> iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<Integer, String> entry = iterator.next(); int mapKey = entry.getKey(); String mapValue = entry.getValue(); if (mapKey % keyFilter == 0 && mapValue.indexOf(valueFilter) != -1) { iterator.remove(); } } return map; }
解决方案2:使用内置removeIf方法(Java 8+推荐)
Java 8开始Collection接口新增了内置的removeIf默认方法,专门用于按条件批量删除集合元素,底层已经封装了安全的迭代删除逻辑,代码更简洁可读性更高:
public static TreeMap<Integer, String> filterTreeMap( TreeMap<Integer, String> map, int keyFilter, char valueFilter) { map.entrySet().removeIf(entry -> entry.getKey() % keyFilter == 0 && entry.getValue().indexOf(valueFilter) != -1 ); return map; }
补充说明
如果你的业务场景不允许修改传入的原TreeMap对象,可以先复制一份新的Map再做删除操作,避免影响调用方持有的原数据:
public static TreeMap<Integer, String> filterTreeMap( TreeMap<Integer, String> map, int keyFilter, char valueFilter) { // 复制原Map数据到新对象,不修改原输入 TreeMap<Integer, String> filteredMap = new TreeMap<>(map); filteredMap.entrySet().removeIf(entry -> entry.getKey() % keyFilter == 0 && entry.getValue().indexOf(valueFilter) != -1 ); return filteredMap; }
内容的提问来源于stack exchange,提问作者Rey Cai
相关产品推荐
相关产品推荐

