我想根据第二个列表中的某些字符串匹配来过滤第一个列表。
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();
}
}
}
}
您正在执行两次。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--
尽管您可以使用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();
}
}
}
}