【发布时间】: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