[java.util.NoSuchElementException在对数组列表执行操作时发生

问题描述 投票:0回答:2

我想根据第二个列表中的某些字符串匹配来过滤第一个列表。

  private void getFilteredList(List<String> fileLst, List<OrderDetailsDTO> msisdnList) {
    Iterator<String> it = fileLst.iterator();
    while(it.hasNext()){
      for(OrderDetailsDTO item: msisdnList){
        if(it.next() != null && ! it.next().contains(item.getMsisdn())){
          it.remove();
        }
      }
    }
  }
java arraylist nosuchelementexception
2个回答
0
投票

您正在执行两次。next()。一旦执行了它,hasNext()就可以直接执行它。next()。contains(item.getMsisdn())而不是对其进行检查。next()!= null。

it.next()

返回:迭代中的下一个元素

抛出:NoSuchElementException-如果迭代中没有更多元素

因此,在调用它之前,应始终调用它。hasNext()。next();

请检查https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html#next--


0
投票

尽管您可以使用Iterator完成此操作,但实际上并不需要它。更干净的方法是使用内部循环中的增强型for循环。

来到您的问题:您遇到了这个问题,因为您多次调用it.next(),这导致迭代器在每次调用时都向前移动。

另一个问题是您已经反过来应用了contains

执行以下操作:

private void getFilteredList(List<String> fileLst, List<OrderDetailsDTO> msisdnList) {
    Iterator<String> it = fileLst.iterator();
    while(it.hasNext()) {
        String value = it.next();
        for(OrderDetailsDTO item: msisdnList){
            if(value != null && item!=null && item.getMsisdn() != null && !item.getMsisdn().contains(value)){
                it.remove();
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.