[英]Iterator remove
我根据 fieldsToRemove 列表从 XML 字符串中删除了一些字段。
List<String> fieldsToRemove = //list of fields to be remove.
String eventString = //XML String.
List<String> list = new ArrayList<>(Arrays.asList(eventString.split("\n")));
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String line = iterator.next();
for (String field : fieldsToRemove) {
if (line.contains(field)) {
iterator.remove();
}
}
}
但是我收到了这个错误,无论 XML 字符串是单行(未格式化):
20211015;07:16:01: java.lang.IllegalStateException
20211015;07:16:01: at java.util.ArrayList$Itr.remove(ArrayList.java:874)
让我们来看看这里到底发生了什么。
假设您有以下文本:
<root><child></child></root>
由\\n
拆分(字符串中不存在)将导致您的列表具有单个元素。
fieldsToRemove
看起来像这样:
List<String> fieldsToRemove = List.of("root", "child");
然后发生以下情况:
String line = iterator.next();
– 您从迭代器中检索唯一一行,其中包含“root”和“child”;for (String field : fieldsToRemove) {
– 您遍历所有要删除的元素...if (line.contains(field)) {
如果它存在于行中...iterator.remove();
它。 因此找到“root”,删除该行,然后找到“child”,这会导致再次删除同一行。 当然, iterator
不喜欢这样,会抛出异常。
为了“修复”此问题,请在对remove()
的调用下方添加一个break
:
iterator.remove();
break;
但是,我不确定为什么要删除 XML 文档中的整行。 为什么不使用 XML 解析器?
当您使用Iterator进行迭代时,您无法通过添加或删除来更改ArrayList的大小。
如果要执行此类操作,请使用流 api或使用另一个数组列表来存储结果。
使用流 api 的简单示例:
String wordsToFilter = "XXX";
list = list.stream()
.filter(s -> !s.contains(wordsToFilter))
.collect(Collectors.toList());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.