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

Rob*_*rto 27 java 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);
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

任何帮助都会很棒

rkg*_*rkg 33

这是你想要做的:

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

  • @SrujanBarai - 不.(字面意思是......它会"不会跳过它") (2认同)

Ste*_*n C 24

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

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

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

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


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

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

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

  • 如果你看一下迭代器的源代码,你的答案的第二部分都不是真的.迭代器包含2个变量:`int cursor`指向下一个元素,`int lastRet`指向返回的最后一个元素.因此不需要额外的场.这些是索引号而不是对象本身,因此迭代器不会以任何方式"挂起"当前对象.游标模型用于解释迭代器的设计,而不是相反.并不是因为90%不会使用它,你不必实现它.那只是糟糕的设计. (3认同)