ListIterator 以前的方法不起作用

Posted

技术标签:

【中文标题】ListIterator 以前的方法不起作用【英文标题】:ListIterator previous method not working 【发布时间】:2013-10-28 09:56:18 【问题描述】:
package wrap;
import java.util.*;
public class ArrayListDemo 

    public static void main(String [] args)
        ArrayList<String> a=new ArrayList<String>();
        a.add("B");
        a.add("C");
        a.add("D");
        ListIterator<String> i=a.listIterator();
        while(i.hasPrevious())
            System.out.println(i.previous());
        
    


该程序适用于 hasNext() 和 next() 方法,但对于 hasPrevious() 和 previous() 它显示如下消息::

<terminated> ArrayListDemo [Java Application] C:\Program Files (x86)\Java\jre7\bin\javaw.exe (28-Oct-2013 3:20:35 PM)

【问题讨论】:

【参考方案1】:

来自文档:

public ListIterator<E> listIterator()

返回此列表中元素的列表迭代器(在适当的 序列)。

boolean hasPrevious()

如果此列表迭代器在遍历时有更多元素,则返回 true 反方向的列表。

由于迭代器位于第一个位置,hasPrevious() 将返回 false,因此不会执行 while 循环。

 a's elements

    "B"  "C"  "D"
     ^
     |

Iterator is in first position so there is no previous element

如果你这样做:

    ListIterator<String> i=a.listIterator(); <- in first position
    i.next(); <- move the iterator to the second position
    while(i.hasPrevious())
        System.out.println(i.previous());
    

它将打印"B",因为您处于以下情况:


a的元素
        "B"  "C"  "D"
              ^
              |
    Iterator is in second position so the previous element is "B"

您也可以使用方法listIterator(int index)。它允许您将迭代器放置在index 定义的位置。

如果你这样做:

ListIterator<String> i=a.listIterator(a.size());

它会打印出来

D
C
B

【讨论】:

【参考方案2】:

由于您获得了列表的默认ListIterator,它从第一个元素开始,这就是hasPrevious() 返回false 并退出while 循环的原因。如果您想以相反的顺序遍历列表,请从最后一个索引中获取ListIterator,然后使用hasPrevious()previous() 方法向后遍历。

ListIterator<String> i = a.listIterator(a.size()); // Get the list iterator from the last index
while (i.hasPrevious()) 
    System.out.println(i.previous());

【讨论】:

【参考方案3】:
ListIterator<String> i=a.listIterator();

最初的迭代器我会指向index of 0

您位于index 0,因此没有先前的元素。

【讨论】:

【参考方案4】:

它将从列表的前面开始,因此在该点之前没有任何内容。如果你想使用这些方法,请使用ListIterator.

Docs.

【讨论】:

【参考方案5】:

您允许到达列表的末尾或中间的任何位置以返回。索引 0 处的元素没有前一个元素。

例如

System.out.println("Elements in forward directiton");
        while(i.hasNext())
            System.out.println(i.next());
        
System.out.println("Elements in backward directiton");
        while(i.hasPrevious())
            System.out.println(i.previous());
        

【讨论】:

【参考方案6】:

正如其他人所说,你的指针仍然指向 List 中的第一个元素,所以 -1 是不可能的。

大小为 n 的列表将以 1,2 ....n-1 作为索引。

n-1 不是 -1。

这就是 hasPrevious 和 previous 不适合您的原因。

干杯。

【讨论】:

以上是关于ListIterator 以前的方法不起作用的主要内容,如果未能解决你的问题,请参考以下文章

从另一个视图重新绑定剑道网格到以前的搜索条件的正确方法是啥(后退按钮不起作用)

多维动态数组,为啥不起作用?

2018第17周总结

使用dwr后,javaweb设置的session超时失效,web.xml和tomcat设置都不起作

UITableViewCell 样式字幕多行不起作用

Hibernate HQL Count Distinct 不起作用?