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)
如果列表只有一个元素,那就更清楚了,让我们说"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)
当迭代器位于最后一个“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)
| 归档时间: |
|
| 查看次数: |
11120 次 |
| 最近记录: |