首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >迭代器超出边界

迭代器超出边界
EN

Stack Overflow用户
提问于 2018-06-05 04:27:09
回答 1查看 519关注 0票数 1

我需要为我的List类实现我自己的迭代器,它的功能类似于Stack并实现java.lang.Iterable。在List类中实现的Iterator方法应该返回一个Iterator。

代码语言:javascript
复制
 @Override
public Iterator<E> iterator() {

    return new Iterator<>() {

        private MyEntry<E> it = begin;

        @Override
        public boolean hasNext() {

            if(pos.next != null) {
                return true;
            }
            else {
                return false;
            }
            }

        @Override
        public E next() {
            if (!hasNext()) {
                reset();
            }
            else {
                it = it.next;
            }
            return it.o;
        }

        @Override
        public void remove() {

        }
    };
}

列表本身就像一个Stack一样工作。它有一个begin条目来标记列表的开始。每个条目都包含对下一个条目的引用。使用pos元素,列表跟踪它的位置。advance()方法允许您逐项传递列表条目。elem()方法返回条目在pos位置的值。add()方法在列表的末尾添加一个条目。delete()方法删除pos处的条目。

代码语言:javascript
复制
import java.util.Iterator;
import java.util.NoSuchElementException;

public class MyList<E> implements Cloneable, java.lang.Iterable {


public MyList() {
    pos = begin = new MyEntry<E>();
}

public boolean empty() {
    return begin.next == null;
}

public boolean endpos() { // true, if end has been reached
    return pos.next == null;
}

public void reset() {
    pos = begin;
}

public void advance() {
    if (endpos()) {
        throw new NoSuchElementException("Already at the end of this List");
    }
    pos = pos.next;
}

public E elem() {
    if (endpos()) {
        throw new NoSuchElementException("Already at the end of this List");
    }
    return pos.next.o;
}


public void add(E x) {
    MyEntry<E> newone = new MyEntry<E>(x, pos.next);

    pos.next = newone;
}


public void delete() {
    if (endpos()) {
        throw new NoSuchElementException("Already at the end of this List");
    }
    pos.next = pos.next.next;
}

列表中包含的条目有一个泛型值o和一个指向下一个MyEntry的引用

代码语言:javascript
复制
    class MyEntry<E>  {

    MyEntry<E> next;
    E o;

    MyEntry() {
        this(null, null);
    }

    MyEntry(E o) {
        this(o, null);
    }

    MyEntry(E o, MyEntry<E> e) {
        this.o = o;
        this.next = e;
    }
}

但是在我用我的测试类MyListTest测试它的时候,我得到了三个测试字符串,但是在那之后,程序员在返回它的NullPointerException ()方法中抛出了一个字符串。

代码语言:javascript
复制
import org.junit.Test;
import java.util.*;

public class MyListTest {

 @Test
 public void test() {
     MyList list = new MyList();
     Iterator itr = list.iterator();

    list.add("a");
    list.add("b");
    list.add("c");

    while(itr.hasNext()) {
        Object element = itr.next();
        System.out.println(element + " ");
    }

    iter.remove();

    while(itr.hasNext()) {
        Object element = itr.next();
        System.out.println(element + " ");
    }
}

}

我的问题是,为什么迭代器在最后一次输入后超出边界,以及如何防止这种情况发生。

EN

回答 1

Stack Overflow用户

发布于 2018-06-05 06:27:46

因此,解决方案是hasNext()方法

代码语言:javascript
复制
        @Override
        public boolean hasNext() {

            if(pos.next != null) {
                return true;
            }
            else {
                return false;
            }
        }

应该是

代码语言:javascript
复制
        @Override
        public boolean hasNext() {

            if(it.next != null) {
                return true;
            }
            else {
                return false;
            }
        }

因为hasNext()和next()都不应该干扰pos元素。迭代器应该保持自己的位置独立于类的其余部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50688273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档