You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:18:05