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

2022-09-01 09:23:39

我正在尝试在树集中实现搜索方法。通过使用具有条件的迭代器,我希望能够运行集合并打印与条件匹配的对象。但是,我目前这样做的方式是打印出后续对象而不是当前对象。这是我到目前为止所拥有的:

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

    }

任何帮助都会很棒


答案 1

这是您要执行的操作:

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

答案 2

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

根据记录,API 不允许您执行此操作。没有“当前”对象的概念。该方法为您提供下一个对象...然后继续前进。IteratorIterator.next()

(和 方法类似。请注意,在这种情况下,方法行为以游标的形式记录,游标表示被迭代序列中元素之前/之间/之后的位置。ListIterator.previous()ListIterator.next()ListIterator

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


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

  • 这将使典型的迭代器对象更大;即一个额外的字段来保存当前对象。
  • 这意味着迭代器类要实现更多的1个方法。
  • 当前对象的概念与界面中记录的“光标”模型不太吻合......并由当前设计暗示。ListIteratorIterator
  • 迭代器“挂在”当前对象上存在一个小问题,从而阻止它被GC'ed。
  • 绝大多数迭代器用例不需要当前对象。
  • 还有其他方法可以解决这个问题。

听起来像一个很好的电话...