繁体   English   中英

如何引用迭代器中的当前对象

[英]How do I refer to the current object in an iterator

我试图在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);
            }
        }

    }

任何帮助都会很棒

这是你想要做的:

while (it.hasNext()) {
            Person p = it.next();
            if (p.getLast().toLowerCase().equals(last)) {
                System.out.println(p);
            }
        }

如何引用迭代器中的当前对象

对于记录, Iterator API不允许您这样做。 没有“当前”对象的概念。 Iterator.next()方法为您提供下一个对象...并继续前进。

ListIterator.previous()ListIterator.next()方法是类似的。请注意,在ListIterator情况下,方法行为是根据游标来记录的,该游标表示迭代序列中元素之前/之间/之后的位置。)

解决方案是将调用it.next()的结果分配给临时变量,如接受的答案所述。


我不确定为什么设计师没有在API中包含“当前”对象的概念,但我可以想到几个原因:

  • 它会使典型的迭代器对象更大; 即一个额外的字段来保存当前对象。
  • 这意味着要为Iterator类实现更多的方法。
  • 当前对象的概念不适合ListIterator接口中记录的“游标”模型......并且由当前的Iterator设计暗示。
  • 迭代器“挂在”当前对象上有一个小问题,从而阻止它被GC控制。
  • 绝大多数迭代器用例不需要当前对象。
  • 还有其他方法可以解决这个问题。

听起来很不错......

如果您需要现有的实现,可以使用Google GuavaApache Commons Collections中的实现
其他答案对于您的简单问题更容易,但如果您需要传递迭代器并跟踪next()返回的最后一项,这些将有所帮助。

下面是一个使用Guava和OP代码的例子(假设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);
        }
    }

}

在单独的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();
 }

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;
    }
}

如果它返回下一个而不是当前的那个,则无法到达第一个

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM