1

我需要迭代ArrayList除最后一个之外的所有元素。所以我想创建这样的迭代器。但是我没有实现整个迭代器,我只需要重写hasNext()方法,所以我想继承一个“标准”迭代器。有没有办法做到这一点?

4

3 回答 3

3

我认为比覆盖默认迭代器更好的方法是自己迭代ArrayList。AnArrayList定义了几个方法可以帮助您完成任务:get(int)size().
您所要做的就是获取ArrayList(with size()) 中的元素总数,然后使用该get()方法在每次迭代中直接访问每个元素的元素循环。您的代码将如下所示:

    for(int i = 0; i < myList.size() - 1; i++){
       element = myList.get(i);
       //do something
    }

现在牢记这一原则,您可以创建自己的类来迭代ArrayList.

于 2013-04-14T13:58:49.893 回答
1

修改迭代器以执行此遍历会很奇怪。显而易见的事情是根据需要编写“算法”:

public static <T> void eachExceptLast(List<? extends T> list, Operation<T> op) {
     Iterator<T> iter = list.iterator();
     if (!iter.hasNext()) {
         return;
     }
     T item = iter.next();
     while (iter.hasNext()) {
         op.run(item);
         item = iter.next();
     }
}

(或使用假设RandomAccess列表的索引。)

但是,有一种更好的方法可以做到这一点。list.subList(0, list.size()-1)(对于非空列表)将返回原始列表减去最后一个元素的视图。它不做副本,你甚至可以使用Iterator.remove.

于 2013-04-14T14:33:31.707 回答
0

您可以创建一个实现IteratorListIterator接口的类,然后覆盖该hasNext()方法。

于 2013-04-14T13:52:47.443 回答