如果不是,则指向列表的指针的初始索引 是列表中的第一项。
执行下一个方法
(1)返回下一个元素并指向下一个元素 要么 (2)返回原始元素并将指针设置为下一个元素。
但是如果(1)为真,则指针位于第一个元素上,则第一个元素不能返回,即如果(1)为真,则指针应位于第一个元素之前,即 某种-1位置。
另一方面,如果(2)为真,那么我们可以删除第一个元素,但是我们不能通过使用下一个元素来获取下一个元素,因为我们将索引减少1;
这让我想到下一个问题,remove()方法将索引减一或保持不变??
上下文代码如下所示:
package iterators;
import java.util.ArrayList;
import java.util.Iterator;
public class Array_practice {
public static void main(String args[])
{
ArrayList<Integer> list= new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
Iterator<Integer> iterator= list.iterator();
iterator.remove();//does not work why??
}
}
答案 0 :(得分:5)
如果它不是列表的第一项
,那么指向列表的指针的初始索引
没有。 之前列表的第一项。您第一次拨打next()
时才能到达第一个项目。
事实上,将迭代器视为项之间的通常更简单。例如,使用您的列表:
1 2 3
^ // Initial position
^ // After calling next()
^ // After calling next()
^ // After calling next() the third time - now hasNext() will return
// false
然后remove()
- 如文档所示 - 删除上次返回的项目。
在任何项目退回之前,您正在致电remove()
,因此无需删除。
答案 1 :(得分:1)
Iterator接口的Javadoc如下:
void remove()
从底层集合中移除此迭代器返回的最后一个元素(可选操作)。每次调用next()时,只能调用此方法一次。如果在迭代正在进行的过程中修改基础集合而不是通过调用此方法,则迭代器的行为是未指定的。
因此在调用next()之前使用remove()将永远不会返回一个元素。当然,如果您正在迭代的类尊重实现Iterable的合同 - 这显然是ArrayList和其他java.util集合的情况。