我正在尝试在TreeSet中实现搜索方法。通过使用带有condtional的迭代器,我希望能够遍历集合并打印匹配条件的对象。然而,我现在这样做的方式是打印出后续对象而不是当前对象。 这就是我到目前为止所做的:
public void getDetails() {
Iterator<Person> it = this.getPersonSet().iterator();
System.out.println("Enter First Name");
String first = in.next().toLowerCase();
System.out.println("Enter Second Name");
String last = in.next().toLowerCase();
while (it.hasNext()) {
if (it.next().getLast().toLowerCase().equals(last)) {
Person p = it.next();
System.out.println(p);
}
}
}
任何帮助都会很棒
答案 0 :(得分:32)
这是你想要做的:
while (it.hasNext()) {
Person p = it.next();
if (p.getLast().toLowerCase().equals(last)) {
System.out.println(p);
}
}
答案 1 :(得分:22)
如何引用迭代器中的当前对象
对于记录,Iterator
API不允许您这样做。没有“当前”对象的概念。 Iterator.next()
方法为您提供下一个对象...并继续前进。
(ListIterator.previous()
和ListIterator.next()
方法是类似的。请注意,在ListIterator
情况下,方法行为是根据表示元素之前/之间/之后的位置的光标记录的在被迭代的序列中。)
解决方案是将调用it.next()
的结果分配给临时变量,如接受的答案所述。
我不确定为什么设计师没有在API中包含“当前”对象的概念,但我可以想到几个原因:
ListIterator
界面中记录的“光标”模型......并且由当前Iterator
设计隐含。听起来很不错......
答案 2 :(得分:3)
如果您需要现有的实施,可以使用Google Guava或Apache Commons Collections中的实施 对于你的简单问题,其他答案更容易,但如果你需要传递迭代器并跟踪next()返回的最后一项,这些将有所帮助。
以下是使用带有OP代码的Guava的示例(假设Person
确实有String toLowerCase()
方法):
import com.google.common.collect.PeekingIterator;
import static com.google.common.collect.Iterators.peekingIterator;
public void getDetails() {
PeekingIterator<Person> it = peekingIterator(this.getPersonSet().iterator());
System.out.println("Enter First Name");
String first = in.next().toLowerCase();
System.out.println("Enter Second Name");
String last = in.next().toLowerCase();
while (it.hasNext()) {
// note the usage of peek() instead of next()
if (it.peek().getLast().toLowerCase().equals(last)) {
Person p = it.next();
System.out.println(p);
}
}
}
答案 3 :(得分:1)
将对象的引用保存在单独的var:
中Person current = it.next();
current.methodOne();
current.methodTwo();
当你完成当前值后,重新给它下一个
...
// done?
current = it.next();
在循环中看起来像:
while( it.hasNext() ) {
Person current = it.next();
current.doA();
current.doB();
current.doC();
}
答案 4 :(得分:0)
next()方法返回当前对象,如下所示:
private class IterSinglyLinked implements SimpleIterator<T> {
Element curr = head; // next element to return
public boolean hasNext() {
return curr != null;
}
public T next() throws Exception {
if (curr == null) throw new Exception("no more elements");
T data = curr.data;
curr = curr.next;
return data;
}
}
如果返回的是下一个而不是当前的,则无法到达第一个