【问题标题】:Java LinkedList ListIterator behaviorJava LinkedList ListIterator 行为
【发布时间】:2017-03-21 01:01:43
【问题描述】:

我在 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());
    }
}

【问题讨论】:

  • 您能否包含您运行得出这些结论的实际代码?
  • 对不起,在这里。
  • 当你第二次调用 next (2) 时,它会将光标移动到 3,因此前一个将是 2。看起来合乎逻辑。
  • 我认为定义是合乎逻辑的,但不是很直观 - 是吗?
  • 另一种选择是 next 移动光标然后获取元素,这意味着如果从列表的开头调用 next 将丢失第一个元素。反之亦然。

标签: java list linked-list listiterator


【解决方案1】:

可以想象一下,Java 中的迭代器从不指向特定元素,而是在第一个元素之前、两个元素之间或最后一个元素之后。

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

 1 2 3 4
^

当你调用next时,1被返回并且迭代器向前移动:

 1 2 3 4
  ^    

当你再次调用next 时,2 被返回并且迭代器向前移动:

 1 2 3 4
    ^

当你调用prev时,2被返回并且迭代器向后移动:

 1 2 3 4
  ^    

所以下一次调用next 将返回2

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

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

【讨论】:

  • 好吧,它是一个很好的解释,至少它使图像更容易。但他们为什么这样做呢?只要它可以更直观,为什么不这样做呢?
  • 添加了理由。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多