1

我从一个类中得到一个迭代器,我想得到那个迭代器的第 x 个元素。我知道我可以将它加载到循环中的 ArrayList 或检查计数器,但这似乎效率低下/丑陋。做这个的最好方式是什么?

我想像,

List al = new ArrayList(myIterator);
  myval = al.get(6);

但是那个构造函数是未定义的。谢谢。

4

3 回答 3

9

an 的定义Iterator不允许对某个位置进行任意索引。这就是它的定义方式。如果您需要该功能,则必须将数据加载到可索引的集合中。

接口的重点Iterator是允许在不知道集合大小的情况下对集合进行顺序访问。迭代器可以是只进的或双向的 ( ListIterator)。它只是访问集合元素的一种特定模型。一个优点是它与集合大小无关,它可能太大而无法完全放入内存。通过只允许顺序访问,实现可以在任何给定时刻自由地将集合的一部分保留在内存中。

如果您需要将迭代器内容加载到列表中,您需要自己使用循环来完成。

于 2012-06-06T18:00:26.063 回答
6

不,你已经命名了唯一的方法。您最终将需要一个for循环来迭代到适当的位置。

一些实用程序库具有将an的内容加载IteratorArrayList到 an或获取an 的n第 th 元素的Iterator快捷方式,但 JDK 中没有内置任何内容。

于 2012-06-06T18:03:21.840 回答
0

作为一种解决方法,我在我的实用程序类中有这个方法

     /**
     * Retrieve the n position object of iterator 
     * @param iterator
     * @param position
     * @return Object at position
     * @throws Exception 
     */
    public static Object iterateTo(Iterator iterator, int position) throws Exception{
        
        if(iterator == null){
            throw new Exception("iterator == null");
        }

        if(position < 0){
            throw new Exception("position < 0");
        }
        
        while(iterator.hasNext() && position > 0){
            position--;
            iterator.next();
        }
        
        if(position != 0){
            throw new Exception("position out of limit");
        }
        
        return iterator.next();
        
    }

所以而不是这个

{
List al = new ArrayList(myIterator);
  myval = al.get(6);
}

你不得不

{
Object myVal = Utilities.iterateTo(myIterator, 6);
}
于 2021-11-16T12:01:51.500 回答