Java: итераторы - PullRequest
       7

Java: итераторы

3 голосов
/ 06 мая 2011

Итак, я работаю над программой, которая включает два типа данных: связанный список и Arraylist.

Связанный итератор списка выглядит следующим образом:

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.

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

Моя проблема в том, когда я вызываю свои методы, чтобы получить мой объект по их идентификатору (переменной экземпляра),это всегда захватывает СЛЕДУЮЩИЙ объект, а не объект, который я хочу.Как получить текущий объект как со списком связанных, так и со списком массивов?

Пожалуйста, помогите мне!

Ответы [ 4 ]

6 голосов
/ 06 мая 2011

Вы используете метод next() дважды, возможно, поэтому.

Попробуйте это

  while (xy.hasNext()) {
        StudentIF tmp = xy.next();
        if (id == tmp.getId()) {
            return tmp;
        }
4 голосов
/ 06 мая 2011

Проблема в том, что вы дважды вызываете .next () в вашем цикле:

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

Вызов next () дважды продвинет ваш итератор дважды, а это не то, что вам нужно. Вам необходимо сохранить следующее значение во временной переменной, например:

StudentIF nextStudent = xy.next();
if (nextStudent.getId() == id)
{
    return nextStudent;
}
3 голосов
/ 06 мая 2011

Каждый раз, когда вы используете метод 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;

}

2 голосов
/ 06 мая 2011

Вы звоните .next() дважды.

Решение должно вызывать его только один раз и сохранять в такой переменной:

 while (xy.hasNext()) {
        StudentIF student = xy.next();
        if (id == student.getId()) {
            return student;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...