我在LinkedList
中有一个Java
个对象,我想对其进行遍历,当我在其中找到一个特定对象时-我要取下一个对象(紧接在下一个对象)到第一个)。
我认为这可以解决问题:
listIterator = items.listIterator();
while (listIterator.hasNext() && listIterator.previous().getCode().equals(search.getCurrentCode())) {
item = listIterator.next();
result.setCurrentCode(item.getCode());
break;
}
但是我遇到错误:
java.util.NoSuchElementException: null
我认为是因为使用了.previous
,但是我不知道如何正确处理,那我该如何解决?我正在使用previous
,但是我想使用的是当前元素-我认为这是由.previous
处理的,但显然不是。
答案 0 :(得分:3)
您当前的代码失败,因为您正在调用之前的代码,甚至没有开始对项目进行迭代。迭代是通过listIterator.next();
调用完成的。
您可以尝试下面的代码。
while (listIterator.hasNext()){
// iterate always
item = listIterator.next();
// if found and an element still exist
if(item.getCode().equals(search.getCurrentCode() && listIterator.hasNext()){
// get the next element
item = listIterator.next();
result.setCurrentCode(item.getCode());
break;
}
}
答案 1 :(得分:0)
尝试一下:
listIterator = items.listIterator();
// listIterator.previous() does not exist in first iteration
while (listIterator.hasNext()) {
// you can compare previous value if it exist
if(listIterator.hasPrevious() && listIterator.previous().getCode().equals(search.getCurrentCode())){
item = listIterator.next();
result.setCurrentCode(item.getCode());
break;
}
}
答案 2 :(得分:0)
首先,我建议使用ArrayList
而不是LinkedList
,因为前者几乎总是更好的选择。 see this post以获得更多信息。
您绝对可以通过典型的for循环或增强的for循环来执行此操作,但是我想说明一种自dropWhile
开始的JDK9新方法,它可以帮助您满足您的以下要求:
假设您已安装ArrayList
。您可以简单地做到:
myList.stream()
.dropWhile(c -> !c.getCode().equals(search.getCurrentCode()))
.skip(1) // get the object to the right of the matched item
.findFirst() // retrieve this object
.ifPresent(s -> result.setCurrentCode(s.getCode())); // apply the logic based on the found object