正确实现列表迭代器方法

23k

为了更好地了解Iterators,我将自己编写它们以尝试并获得它们的正确功能。我在从ListIterator以前的方法中获取正确的行为时遇到问题

例如,JavaDoc指出:

对下一个和上一个的交替调用将重复返回相同的元素。

我的迭代器

class Node<Item> {
    public Item data;
    public Node<Item> next;
    public Node<Item> previous;

    public Node() {
        data = null;
        next = null;
        previous = null;
    }

    public Node(Item i, Node<Item> n, Node<Item> p) {
        data = i;
        next = n;
        previous = p;
    }
}

public ListIterator<Item> listIterator() {

    return new ListIterator<Item>() {

        private Node<Item> n = first;

        public boolean hasNext() {
            return n.next != last;
        }

        public Item next() {
            n = n.next;
            return n.data;
        }

        //TODO
        public void remove() {
        }

        public boolean hasPrevious() {
            return n.previous != first;
        }

        public Item previous() {
            n = n.previous;
            return n.data;
        }
    };
}

现在,当我对其进行测试时,该previous()方法的行为不正确

测试

LinkedList<String> lst2 = new LinkedList<String>();

    for (int i = 0; i < 4; i++)
        lst2.add("" + "data".substring(i, i + 1));

    ListIterator<String> it2 = lst2.listIterator();
    System.out.println("\nTest the list iterator.\nThe test list is " + lst2 + "\n");

    while (it2.hasNext()) {
        System.out.println("next is " + it2.next());
        System.out.println("previous is " + it2.previous());
        if (removeImplemented) {
            it2.remove();
            System.out.println("After remove: " + lst2);
        }
        System.out.println("next is " + it2.next());
    }

    System.out.println("\nHere is how the built-in Java ArrayList class works\n");
    ArrayList<String> lst3 = new ArrayList<String>();

    for (int i = 0; i < 4; i++)
        lst3.add("" + "data".substring(i, i + 1));

    ListIterator<String> it3 = lst3.listIterator();
    System.out.println("Test list iterator.\nThe test list is " + lst3 + "\n");

    boolean remove = false;

    while (it3.hasNext()) {
        System.out.println("next is " + it3.next());
        System.out.println("previous is " + it3.previous());
        if (remove) {
            it3.remove();
            System.out.println("After remove: " + lst3);
        }
        System.out.println("next is " + it3.next());
    }

我的结果

The test list is [d, a, t, a]

next is d
previous is null //incorrect
next is d
next is a
previous is d //incorrect
next is a
next is t
previous is a //incorrect
next is t
next is a
previous is t //incorrect
next is a

正确的结果

The test list is [d, a, t, a]

next is d
previous is d
next is d
next is a
previous is a
next is a
next is t
previous is t
next is t
next is a
previous is a
next is a

现在,据我了解,第二组结果是的正确行为ListIterator那么,我该怎么做才能实现这种行为?从我读到的内容来看,这与光标被移到元素之前有关,而不是元素本身。我在想办法实现这一点时遇到了麻烦。

丹尼尔·威迪斯(Daniel Widdis)

您已正确实现的行为next(),前进到下一个节点并返回新值。

但是,的行为previous()需要在更改到上一个节点之前返回现有值。n.data在更新之前n您必须存储在一个临时变量中,然后返回存储的临时值。

例如:

public Item previous() {
    Item temp = n.data;
    n = n.previous;
    return temp;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正确实现列表迭代器方法

来自分类Dev

正确实现的递归惰性迭代器函数永远不会堆栈溢出吗?

来自分类Dev

如何正确实现 -> 和 (*)。这样它们的行为就像 -> 和 (*)。在迭代器中

来自分类Dev

高斯滤波器正确实现

来自分类Dev

为迭代器实现泛型方法的正确方法

来自分类Dev

为迭代器实现通用方法的正确方法

来自分类Dev

哈希集中的重复元素(正确实现比较器/ compare方法之后)

来自分类Dev

努力正确实现自定义 rails 控制器方法

来自分类Dev

正确实现类属性获取器/设置器的生产

来自分类Dev

正确实现 RunAsync()

来自分类Dev

如何正确实现此Hibernate NamedQuery获取对象列表?

来自分类Dev

如何正确实现三巨头:单链接列表(C ++)

来自分类Dev

如何使用带通滤波器正确实现均衡

来自分类Dev

如何使用codeigniter正确实现PHPass密码哈希器?

来自分类Dev

如何使用带通滤波器正确实现均衡

来自分类Dev

如何正确实现重载类的装饰器接口

来自分类Dev

如何实现“方列表”迭代器

来自分类Dev

为不可修改的列表实现迭代器

来自分类Dev

如何正确实现此类?

来自分类Dev

正确实现ListView的addFooterView

来自分类Dev

在C ++ 17中实现迭代器和const_iterator的正确方法是什么?

来自分类Dev

返回链接列表的正确迭代器类型

来自分类Dev

迭代器块的编译器实现不正确?

来自分类Dev

C#正确实现Equals方法以及如何实现GetHashCode方法

来自分类Dev

哪个类实现迭代器的Next()方法?

来自分类Dev

这是实现迭代器的好方法吗?

来自分类Dev

在C ++中迭代对列表的正确方法?

来自分类Dev

如何使用Picasso库正确实现带有图像的自定义列表视图?

来自分类Dev

在Rails 4中正确实现Parsley.js自定义远程验证器

Related 相关文章

  1. 1

    正确实现列表迭代器方法

  2. 2

    正确实现的递归惰性迭代器函数永远不会堆栈溢出吗?

  3. 3

    如何正确实现 -> 和 (*)。这样它们的行为就像 -> 和 (*)。在迭代器中

  4. 4

    高斯滤波器正确实现

  5. 5

    为迭代器实现泛型方法的正确方法

  6. 6

    为迭代器实现通用方法的正确方法

  7. 7

    哈希集中的重复元素(正确实现比较器/ compare方法之后)

  8. 8

    努力正确实现自定义 rails 控制器方法

  9. 9

    正确实现类属性获取器/设置器的生产

  10. 10

    正确实现 RunAsync()

  11. 11

    如何正确实现此Hibernate NamedQuery获取对象列表?

  12. 12

    如何正确实现三巨头:单链接列表(C ++)

  13. 13

    如何使用带通滤波器正确实现均衡

  14. 14

    如何使用codeigniter正确实现PHPass密码哈希器?

  15. 15

    如何使用带通滤波器正确实现均衡

  16. 16

    如何正确实现重载类的装饰器接口

  17. 17

    如何实现“方列表”迭代器

  18. 18

    为不可修改的列表实现迭代器

  19. 19

    如何正确实现此类?

  20. 20

    正确实现ListView的addFooterView

  21. 21

    在C ++ 17中实现迭代器和const_iterator的正确方法是什么?

  22. 22

    返回链接列表的正确迭代器类型

  23. 23

    迭代器块的编译器实现不正确?

  24. 24

    C#正确实现Equals方法以及如何实现GetHashCode方法

  25. 25

    哪个类实现迭代器的Next()方法?

  26. 26

    这是实现迭代器的好方法吗?

  27. 27

    在C ++中迭代对列表的正确方法?

  28. 28

    如何使用Picasso库正确实现带有图像的自定义列表视图?

  29. 29

    在Rails 4中正确实现Parsley.js自定义远程验证器

热门标签

归档