如何删除ArrayList中两个指定标签之间的元素且避免误删外部重复值
解决方案
你遇到的核心问题是removeAll()会匹配列表中所有相同值的元素删除,不要使用「收集待删除值再批量删除」的思路,改用以下两种实现即可解决:
方案1:收集需要保留的元素(推荐,逻辑简单不易出错)
boolean isInDeleteRange = false; List<String> reserved = new ArrayList<>(); for (String element : elements) { // 遇到开始标签,进入删除区间 if (element.startsWith(startTag)) { isInDeleteRange = true; } // 不在删除区间的元素直接保留 if (!isInDeleteRange) { reserved.add(element); } // 遇到结束标签,退出删除区间 if (element.endsWith(endTag)) { isInDeleteRange = false; } } // 用保留的元素直接替换原列表 elements.clear(); elements.addAll(reserved);
该方案完全规避了按值匹配删除的问题,也不需要处理遍历过程中修改列表的并发异常问题。
方案2:迭代器遍历原地删除
如果不想额外创建存储保留元素的列表,可以使用迭代器的安全删除方法:
boolean isInDeleteRange = false; Iterator<String> iterator = elements.iterator(); while (iterator.hasNext()) { String element = iterator.next(); if (element.startsWith(startTag)) { isInDeleteRange = true; } // 直接删除当前处于删除区间的元素 if (isInDeleteRange) { iterator.remove(); } if (element.endsWith(endTag)) { isInDeleteRange = false; } }
迭代器的remove()方法只会删除当前遍历到的单个元素,不会影响其他位置相同值的元素。
内容的提问来源于stack exchange,提问作者v_uztel
相关产品推荐
相关产品推荐

