结果是
A B C D
D C C2 B2 B A
为什么没有结果
A B B2 C D
首先是D C C2 B2 B A吗?
如果word.equals“ B”我做了li.add(“ B2”)。 next()和previous()之间只是区别吗?我想知道答案。
public static void main(String[] args) {
List<String> list = Arrays.asList("A", "B", "C", "D");
list = new ArrayList<>(list);
ListIterator<String> li = list.listIterator();
String word;
while (li.hasNext()) {
word = li.next();
System.out.print(word + '\t');
if (word.equals("B"))
li.add("B2");
}
System.out.println();
while (li.hasPrevious()) {
word = li.previous();
System.out.print(word + '\t');
if (word.equals("C"))
li.add("C2");
}
}
答案 0 :(得分:1)
答案 1 :(得分:1)
https://docs.oracle.com/javase/7/docs/api/java/util/ListIterator.html
原因是,当您将元素添加到迭代器时,这不会更改next()
元素,而只会更改previous()
。因此,当您添加“ B2”和“ C2”时,它们只会被previous()
调用拾取。这就是为什么第一次迭代不选择B2和C2,而第二次向后迭代同时选择了它们。
答案 2 :(得分:0)
ListIterator#add
的JavaDoc指定行为:
* Inserts the specified element into the list (optional operation).
* The element is inserted immediately before the element that
* would be returned by {@link #next}, if any, and after the element
* that would be returned by {@link #previous}, if any. (If the
* list contains no elements, the new element becomes the sole element
* on the list.) The new element is inserted before the implicit
* cursor: a subsequent call to {@code next} would be unaffected, and a
* subsequent call to {@code previous} would return the new element.
混乱在哪里?
答案 3 :(得分:0)
我认为您的问题的答案在这里-https://docs.oracle.com/javase/7/docs/api/java/util/ListIterator.html#add(E)。
该元素紧接在next()返回的元素之前(如果有的话),然后插入到previous()返回的元素之后(如果有的话)。
新元素将插入到隐式光标之前:对next的后续调用将不受影响,而对previous的后续调用将返回新元素。
在第一个循环中,当单词等于“ B”时,隐式光标位于“ B”和“ C”之间,根据文档说明,新元素将添加在其之前。
A B C D
^ ^
B2 cursor
答案 4 :(得分:0)
通过将打印更改为使用nextIndex
,您可以看到列表更改
System.out.print(list.get(li.nextIndex()) + "["+ li.nextIndex()+ "]" +'\t');
while (li.hasNext()) {
System.out.print(list.get(li.nextIndex()) + "["+ li.nextIndex()+ "]" +'\t');
word = li.next();
if (word.equals("B")) {
li.add("B2");
}
}
System.out.println();
while (li.hasPrevious()) {
word = li.previous();
System.out.print(list.get(li.nextIndex()) + "["+ li.nextIndex()+ "]" +'\t');
if (word.equals("C"))
li.add("C2");
}
}
这将输出
A[0] B[1] C[3] D[4]
D[4] C[3] C2[3] B2[2] B[1] A[0]