Несоответствие типов при написании моего собственного итератора - PullRequest
0 голосов
/ 27 июня 2018

Я написал свой LinkedList, и так как я не хочу выполнять итерации вручную и всегда проверяю null. Я подумал, что должен написать свой собственный метод Iterator для возврата итератора.

Моя проблема в том, что я не знаю, как связать мой список и мой итератор. Я думаю, что это более глубокая причина моей TypeMismatch проблемы.

public class SearchList<T extends Comparable<T>> implements List<T> {

    public class Node {
        T obj;
        Node next;
        int occurences;

        public Node() {
            this.obj = null;
            this.next = null;
            this.occurences = 1;
        }
    }

    private Node head;

    //Here are my List methods
}

А вот итерационный метод

@Override
public Iterator<T> iterator() {

    Node current = head;

    Iterator<T> iterator = new Iterator<T>() {
        @Override
        public boolean hasNext() {
            return current.next != null;
        }

        @Override
        public T next() {
            return current.next;
        }
    };
    return iterator;
}

Intellij жалуется на несоответствие типов в переопределенном методе next () Итератора.

Так как мне правильно это реализовать?

1 Ответ

0 голосов
/ 27 июня 2018

current.next - это другой экземпляр Node (следующий узел), а не данные (типа T)

Измените его на

@Override
public T next() {
    T data = current.obj;
    current = current.next;
    return data;
}

Кроме того, ваше hasNext условие проверяет current.next != null, и вы не сможете получить доступ к последнему элементу из-за этого. Это может быть изменено на current != null

В этом ответе предполагается, что вы хотите Iterable<T>, а не Iterable<Node>.

UPDATE:

Если вы хотите перебрать Node, вы должны вернуть Iterator<Node>

@Override
public Iterator<Node> iterator() {

    Node current = head;

    Iterator<Node> iterator = new Iterator<>() {
        @Override
        public boolean hasNext() {
            return current!= null;
        }

        @Override
        public T next() {
            Node currentNode = current;
            current = current.next;
            return currentNode;
        }
    };
    return iterator;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...