关于指针在Iterator接口迭代的列表中的初始位置的混淆

时间:2014-07-31 13:55:59

标签: java

如果不是,则指向列表的指针的初始索引         是列表中的第一项。

执行下一个方法

(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??

    }

} 

2 个答案:

答案 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集合的情况。