我怎样才能得到我的链表上的下一个对象?
how can I get the next object on my linkedlist?
我在 Java
中有 LinkedList
个对象,我想遍历它,当我在那里找到一个特定对象时 - 我想获取下一个对象(即就在第一个旁边)。
我认为这会解决这个问题:
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
处理的,但显然不是。
试试这个:
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;
}
}
您当前的代码失败,因为您甚至在开始迭代项目之前就调用了之前的代码。迭代是通过 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;
}
}
首先,我建议使用 ArrayList
而不是 LinkedList
,因为前者几乎总是更好的选择。 see this post 获取更多信息。
您当然可以通过典型的 for 循环或增强的 for 循环来完成此操作,但我想说明一种自 JDK9 起称为 dropWhile
的新方法,它可以帮助您完成您的此要求:
假设您已经准备好 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
我在 Java
中有 LinkedList
个对象,我想遍历它,当我在那里找到一个特定对象时 - 我想获取下一个对象(即就在第一个旁边)。
我认为这会解决这个问题:
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
处理的,但显然不是。
试试这个:
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;
}
}
您当前的代码失败,因为您甚至在开始迭代项目之前就调用了之前的代码。迭代是通过 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;
}
}
首先,我建议使用 ArrayList
而不是 LinkedList
,因为前者几乎总是更好的选择。 see this post 获取更多信息。
您当然可以通过典型的 for 循环或增强的 for 循环来完成此操作,但我想说明一种自 JDK9 起称为 dropWhile
的新方法,它可以帮助您完成您的此要求:
假设您已经准备好 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