2016-11-07 55 views
2

我用java.util.ListIterator中在java.util.LinkedList中的工作期待它像工作,在这个伪代码:的Java的LinkedList的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()); 
    } 
} 
+2

你可以包括你运行的实际代码来得出这些结论吗? –

+0

对不起,在这里。 – Agyss

+0

第二次调用下一个(2)时,它会将光标移动到3,所以前一个将是2.看起来合乎逻辑。 –

回答

5

它想象中的Java迭代器永远指向特定元素是有用的,但无论是第一个元素之前,两个元素或只是间中在最后一个元素之后。

因此,迭代器创建时,它看起来像

1 2 3 4 
^ 

当你调用next1返回和迭代器向前移动:

1 2 3 4 
^ 

当你再打电话next,返回2和迭代器向前移动:

1 2 3 4 
    ^

当你调用prev2返回和迭代器向后移动:

1 2 3 4 
^ 

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

请注意,现在有方法可以获取迭代器的“当前”值。获得值的唯一方法是移动迭代器。

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

+0

确实是一个很好的补充,至少它使它更容易成像。但他们为什么这样做?只要它可以更直观,为什么不这样做呢? – Agyss

+0

增加了理由。 – kgeorgiy