Java LinkedList ListIterator 行为

2024-04-26

我正在 java.util.LinkedList 上使用 java.util.ListIterator,期望它像以下伪代码一样工作:

list = (1,2,3,4)
iterator.next should be 1
iterator.next should be 2
iterator.prev should be 1
iterator.next should be 2

但顺序是这样的:

iterator.next is 1
iterator.next is 2
iterator.prev is 2
iterator.next is 2

我不敢相信这就是它的工作方式,所以我创建了一个测试,但它产生了相同的输出。 所以我仔细研究了 ListIterator 的定义,当然是:

next()
Returns the next element in the list and advances the cursor position.
previous()
Returns the previous element in the list and moves the cursor position backwards.

所以实施是正确的,但我仍然有一个问题,为什么他们选择这种行为?我得到它的方式不是更直观吗?

这是测试的代码:

import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;
import java.util.LinkedList;
import java.util.ListIterator;

public class LinkedListTest {
    ListIterator<Integer> iterator;

    @Before
    public void setUp() throws Exception {
        LinkedList<Integer> list = new LinkedList<>();
        for (int i = 1; i < 5; i++) {
            list.add(i);
        }
        iterator = list.listIterator();
    }

    @Test
    public void successfullTest() throws Exception
    {
        assertEquals(1, (int) iterator.next());
        assertEquals(2, (int) iterator.next());
        assertEquals(2, (int) iterator.previous());
        assertEquals(2, (int) iterator.next());
        assertEquals(3, (int) iterator.next());
        assertEquals(4, (int) iterator.next());
    }

    @Test
    public void failingTest() throws Exception
    {
        assertEquals(1, (int) iterator.next());
        assertEquals(2, (int) iterator.next());
        assertEquals(1, (int) iterator.previous());
        assertEquals(2, (int) iterator.next());
        assertEquals(3, (int) iterator.next());
        assertEquals(4, (int) iterator.next());
    }
}

想象一下 Java 中的迭代器从不指向特定元素,但要么在第一个元素之前,要么在两个元素之间的中间,要么就在最后一个元素之后,这是很有用的。

所以,当迭代器创建时,它看起来像

 1 2 3 4
^

你打电话时next, 1返回并且迭代器向前移动:

 1 2 3 4
  ^    

你打电话时next again, 2返回并且迭代器向前移动:

 1 2 3 4
    ^

你打电话时prev, 2返回并且迭代器向后移动:

 1 2 3 4
  ^    

所以下一个电话next将返回2.

请注意,无法获取迭代器的“当前”值。获取值的唯一方法是移动迭代器。

我们可以在 C++ 中看到实现迭代器的另一种方法。要使用 C++ 迭代器,我们需要三个单独的操作:检索当前值、检查是否存在要检索的移动值以及移动迭代器。而java方法只需要两个操作:检查是否有要检索的移动值以及获取值和移动迭代器。所以用Java实现自定义迭代器比用C++更简单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java LinkedList ListIterator 行为 的相关文章

随机推荐