繁体   English   中英

迭代器移除

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM