【问题标题】:Java: IteratorsJava:迭代器
【发布时间】:2011-05-06 02:54:55
【问题描述】:

所以我正在开发一个涉及两种数据类型的程序:链表和数组列表。

链表迭代器看起来像:

private class NodeIterator implements Iterator<StudentIF> {
        private Node curr;

        public NodeIterator(Node head) {
            curr = head;
        }

        public void remove() { }

        public boolean hasNext() {
            if (curr == null)
                return false;
            return true;
        }

        public StudentIF next() {
            Node temp = curr;
            curr = curr.getNext();
            return temp.getData();
        }

    } // end class NodeIterator

然后我调用 ArrayList Iterator 方法/类。

MyArrayListName.iterator();

下面是调用迭代器的方法:

public StudentIF getStudent(int id) {
    Iterator<StudentIF> xy = iterator();
    while (xy.hasNext()) {
        if (id == xy.next().getId()) {
            return xy.next();
        }
    }
    // Student doesn't exist
    return null;
}

我的问题是当我调用我的方法通过它们的 id(实例变量)获取我的对象时,它总是抓取 NEXT 对象,而不是我想要的对象。如何同时使用 Linked List 和 Array 列表获取当前对象?

请帮帮我!

【问题讨论】:

    标签: java oop iterator


    【解决方案1】:

    您使用了两次next() 方法,这可能就是原因。

    试试这个

      while (xy.hasNext()) {
            StudentIF tmp = xy.next();
            if (id == tmp.getId()) {
                return tmp;
            }
    

    【讨论】:

    • 您可能还想提及 for(StudentIF student : xy) 语法,它可以防止出现问题。很好的答案。
    • @ditkin ...他不应该实现Iterable接口才能这样做吗?
    【解决方案2】:

    问题是你在这里的循环中调用了 .next() 两次:

    if (id == xy.next().getId())
    {
        return xy.next();
    }
    

    调用 next() 两次将使您的迭代器前进两次,这不是您想要的。您需要将下一个 off 保存在一个临时变量中,如下所示:

    StudentIF nextStudent = xy.next();
    if (nextStudent.getId() == id)
    {
        return nextStudent;
    }
    

    【讨论】:

    • 谢谢布赖恩。由于赎罪,我接受了你的回答;好赎罪! :-) 我在其他地方有这个错误,这就是我要修复的;感谢您的帮助!
    【解决方案3】:

    每次使用 next() 方法时,它都会增加迭代器,因此通过调用

    if (id == xy.next().getId())
    

    return xy.next();
    

    您实际上是在递增迭代器。

    最好的办法是存储 xy.next(),进行任何需要的比较,然后按如下方式返回:

    public StudentIF getStudent(int id) {
    Iterator<StudentIF> xy = iterator();
    while (xy.hasNext()) {
        StudentIF student = xy.next();
        if (id == student.getId()) {
            return student;
        }
    }
    // Student doesn't exist
    return null;
    

    }

    【讨论】:

      【解决方案4】:

      你打电话给.next() 两次。

      解决方案应该只调用一次并将其保存在这样的变量中:

       while (xy.hasNext()) {
              StudentIF student = xy.next();
              if (id == student.getId()) {
                  return student;
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2010-10-28
        • 2016-04-09
        • 1970-01-01
        • 2015-09-19
        • 2010-11-25
        • 2012-03-23
        • 2014-03-25
        • 2017-06-12
        • 2011-02-05
        相关资源
        最近更新 更多