Java实践:TreeMap按指定条件删除条目 现有代码报错求修复
现有代码问题梳理
- 遍历对象错误:你遍历的是刚初始化的空
finalMap,没有读取传入的原始map的任何条目,过滤逻辑完全不会执行 - 方法调用错误:
getKey()、getValue()是Map.Entry实例的方法,必须通过遍历得到的Entry对象调用,也就是要写成e.getKey()、e.getValue() - 值匹配逻辑错误:
equals()是判断字符串整体和目标对象相等,要判断字符串是否包含指定字符,调用String.indexOf(char)即可,返回值大于等于0就代表包含对应字符 - 并发修改风险:直接在for-each遍历Map的过程中调用
map.remove()会触发ConcurrentModificationException并发修改异常,必须用迭代器实现安全删除 - 不符合返回规则:你直接返回了新建的空map,完全不满足「无删除操作就返回原始传入map」的要求
修正后可运行代码
import java.util.Iterator; import java.util.Map; import java.util.TreeMap; public class MapFilter { public static TreeMap<Integer, String> filterTreeMap( TreeMap<Integer, String> map, int keyFilter, char valueFilter) { // 先复制原始map的所有数据,避免修改外部传入的原始对象 TreeMap<Integer, String> processedMap = new TreeMap<>(map); // 标记是否有条目被删除 boolean hasRemoved = false; // 用迭代器遍历Entry,支持安全删除 Iterator<Map.Entry<Integer, String>> iterator = processedMap.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<Integer, String> entry = iterator.next(); Integer key = entry.getKey(); String value = entry.getValue(); // 同时满足两个过滤条件则删除 if (key % keyFilter == 0 && value.indexOf(valueFilter) >= 0) { iterator.remove(); hasRemoved = true; } } // 无删除返回原始map,有删除返回处理后的map return hasRemoved ? processedMap : map; } }
补充说明
TreeMap是基于红黑树实现的有序Map结构,默认按照键的自然顺序排序,遍历、增删的逻辑和其他通用Map的使用没有区别,只是迭代输出的结果会按照key的大小自动排序。
内容的提问来源于stack exchange,提问作者HY2000
相关产品推荐
相关产品推荐

