我正在学习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);
}
答案 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
将返回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 "";
}
答案 4 :(得分:0)
hasnext()方法只是让你知道列表中是否遗漏了一个字符。 next()是获取角色值的方法。因此,hasnext()不会增加迭代器的位置。它只是告诉下一个位置是否有任何元素,你可以调用next()或进行所需的操作。