Java - ListIterator和hasNext

tes*_*ter 5 java iterator list

我正在学习Java,我遇到了问题ListIterator.我有一个包含这些字符的列表:buongiorn o.我的代码返回"buongiorno",而我期望它打印"buongiorn",没有尾随的"o".由于这个hasNext()功能,我期待这个.我的代码使用递归.你能解释一下原因吗?

public static String creaStringa(List<Character> lista) {
    System.out.println(lista.size());
    ListIterator<Character> it = lista.listIterator();
    return ricCrea(it);
}


public static String ricCrea(ListIterator<Character> it) {
    if(!(it.hasNext())) {
        return "";
    else
        return String.valueOf(it.next()) +ricCrea(it);
}
Run Code Online (Sandbox Code Playgroud)

dar*_*jan 7

如果列表只有一个元素,那就更清楚了,让我们说"b".hasNext()实际上会返回true,并next()会读取它,迭代将在此之后结束.

说明:

如果您调用Iterator<Object> it= list.iterator()任何非空列表(即使它只有一个元素),您可以true调用hasNext().那是因为迭代器在第一个元素之前被初始化:

  b u n g i o r n o
 ^
 i - iterator
Run Code Online (Sandbox Code Playgroud)

当你打电话时next()它会做两件事:

  • 它读取迭代器前面的元素,
  • 在刚刚读取的元素之后和下一个元素之前移动迭代器.

在你的例子中 - 它打印"b"并在"u"之前停止:

  b u n g i o r n o 
   ^
   i
Run Code Online (Sandbox Code Playgroud)

就在结束之前:

  b u n g i o r n o
                 ^
                 i
Run Code Online (Sandbox Code Playgroud)

它实际上有下一个值 - "o".调用next()将读取该值并跳转后o.没有更多的元素.hasNext()将显示false,并且调用next()将导致异常.

技术细节:

实现迭代器的基本思想是: - 当Iterator通过调用iterator()on a 创建List它时,其调用的内部变量next指向列表的第一个元素.- hasNext()只检查是否next!= null.- next()返回next并设置next显示下一个元素.

这是java.util.ArrayListIterator(省略了一些细节):

public Iterator<E> iterator() {
     return new Itr();
}

private class Itr implements Iterator<E> {
     int cursor;       // index of next element to return
     int lastRet = -1; // index of last element returned; -1 if no such
     int expectedModCount = modCount;

     public boolean hasNext() {
         return cursor != size;
     }

     public E next() {
         checkForComodification();
         int i = cursor;
         Object[] elementData = ArrayList.this.elementData;
         cursor = i + 1;
         return (E) elementData[lastRet = i];
     }

 }
Run Code Online (Sandbox Code Playgroud)


Tom*_*ine 0

当迭代器位于最后一个“n”并被ricCrea调用时,thenhasNext将返回true并将next返回“o”。

所以你可能想写这样的东西:

public static String ricCrea(ListIterator<Character> it) {
    if (it.hasNext()) {
        Character c = it.next();
        if (it.hasNext()) {
            return c + ricCrea(it);
        }
    }
    return "";
 }
Run Code Online (Sandbox Code Playgroud)