我从一个类中得到一个迭代器,我想得到那个迭代器的第 x 个元素。我知道我可以将它加载到循环中的 ArrayList 或检查计数器,但这似乎效率低下/丑陋。做这个的最好方式是什么?
我想像,
List al = new ArrayList(myIterator);
myval = al.get(6);
但是那个构造函数是未定义的。谢谢。
an 的定义Iterator
不允许对某个位置进行任意索引。这就是它的定义方式。如果您需要该功能,则必须将数据加载到可索引的集合中。
接口的重点Iterator
是允许在不知道集合大小的情况下对集合进行顺序访问。迭代器可以是只进的或双向的 ( ListIterator
)。它只是访问集合元素的一种特定模型。一个优点是它与集合大小无关,它可能太大而无法完全放入内存。通过只允许顺序访问,实现可以在任何给定时刻自由地将集合的一部分保留在内存中。
如果您需要将迭代器内容加载到列表中,您需要自己使用循环来完成。
不,你已经命名了唯一的方法。您最终将需要一个for
循环来迭代到适当的位置。
一些实用程序库具有将an的内容加载Iterator
ArrayList
到 an或获取an 的n
第 th 元素的Iterator
快捷方式,但 JDK 中没有内置任何内容。
作为一种解决方法,我在我的实用程序类中有这个方法
/**
* 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);
}