Java - ListIterator和hasNext

时间:2013-06-14 01:29:10

标签: java list iterator

我正在学习Java,我遇到ListIterator的问题。我有一个包含这些字符的列表:b o o n g o o n n 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);
}

5 个答案:

答案 0 :(得分:6)

如果列表只有一个元素,那就更清楚了,比方说“b”。 hasNext()实际上会返回true,next()会读取它,迭代将在此之后结束。

<强>解释

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

  b u n g i o r n o
 ^
 i - iterator

当你致电next()时,它会做两件事:

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

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

  b u n g i o r n o 
   ^
   i

就在结束之前:

  b u n g i o r n o
                 ^
                 i

它实际上有下一个值 - “o”。调用next()将读取该值并跳转到o之后。没有更多的元素。 <{1}}将显示false,调用hasNext()将导致异常。

技术细节:

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

这是next迭代器(省略了一些细节):

java.util.ArrayList

答案 1 :(得分:1)

ListIterator.hasNext()也会为最后一个“o”字符返回true(就像其他所有字符一样)。因此,else也会被执行。只有在提取了最后一个“o”之后,hasNext()才会返回false(因为它现在已超过所有元素)。

此处需要注意的是hasNext()仅检查next()电话上是否还有其他内容可用于返回。它本身不会获取或跳过它。

答案 2 :(得分:1)

迭代器开始“指向”第一个之前的项目。

next()使迭代器指向下一个项目并返回它。

所以你实际上正在遍历整个列表。

这是在迭代时启用以下语法:

while (it.hasNext())
{
   ItemClass itemValue = it.next();
   // do something with the value
}

即使迭代器为空,也可以使用相同的语法。

答案 3 :(得分:0)

当迭代器位于最后一个'n'并且ricCrea被调用时,hasNext将返回truenext将返回'o'。

所以你可能想写一些类似的东西:

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

答案 4 :(得分:0)

hasnext()方法只是让你知道列表中是否遗漏了一个字符。 next()是获取角色值的方法。因此,hasnext()不会增加迭代器的位置。它只是告诉下一个位置是否有任何元素,你可以调用next()或进行所需的操作。