Пользовательский итератор для одного объекта - PullRequest
2 голосов
/ 24 января 2020

Я пытаюсь создать итератор для одного объекта (например, файла). Он должен вернуть один файл. Но когда я проверяю этот код, вместо одного пути он возвращает бесконечный l oop путей!

public class File {
public String path;
public File(String str){
   path = str;
}

    @Override
    public Iterator<File> iterator() {
        // TODO
        RegularFile r = this;
        return new Iterator<File>() {
            private boolean i;

            @Override
            public boolean hasNext(){
                return !i;
            }
            @Override
            public File next() {
                if (!hasNext()) throw new NoSuchElementException();
                    i = true;
                    return r;
                            }

        };
    }

public static void main(String[] args){
        File f = new File("C:\temp");
        while (f.iterator().hasNext()) {
            System.out.println(f.iterator().next().path);
        }
}

Что не так?!

1 Ответ

3 голосов
/ 24 января 2020

Этот метод создает Iterator каждый раз, когда вы вызываете его.

public Iterator<File> iterator() {
    // TODO
    RegularFile r = this;
    return new Iterator<File>() {

Этот метод вызывается каждый раз, когда вы go вокруг l oop, создавая fre sh Iterator каждый раз.

    while (f.iterator().hasNext()) {

(Я должен сказать, что имя переменной i и логические отрицания не помогают читать этот код. Этот отступ в next() повсюду - операторы в строке после if выглядят так, как будто они являются частью блока «then», но это не так. Collections.singleton​(path).iterator() будет работать.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...