在迭代一个长列表时跳过项目,效率更高?

时间:2011-08-12 20:44:50

标签: java iteration

我正在使用java.util.List,预计包含大约70,000个对象。它是从有序的数据库查询构建的,因此每次都始终以相同的顺序。此列表正在作为长时间运行任务的一部分进行迭代,该任务可能因外部问题而停止。所以我需要在下次运行任务时跳过列表中的X元素。

出于各种原因,在构建列表的数据库查询中处理此问题不是一种选择。

在进行繁重的工作之前,跳过列表中X项的最有效方法是什么?

int skip = getNumberOfItemsToSkip();
int count = 0;
for(MyThing thing : bigList){
 if(count >= skip){
  //do stuff
 }
}

OR

int skip = getNumberOfItemsToSkip();
int count = 0;
//does subList maintain the order????
List<MyThing> sublist = bigList.subList(skip, bigList.size() - 1);
for(MyThing thing : sublist){
  //do stuff
}

还有其他方法吗?

5 个答案:

答案 0 :(得分:6)

在这种情况下,我不会使用增强的for循环。如果你通过索引访问,那么你可以简单地从一个范围开始和结束。

for(int i = getNumberOfItemsToSkip(); i < bigList.size(); i++) {
  Foo foo = bigList.get(i);
}

答案 1 :(得分:3)

我不会使用List,它需要O(N)进行迭代。我将使用包含查询中密钥的Map并访问O(1)中的每个元素。

答案 2 :(得分:2)

您可以执行以下操作:

int skip = getNumberOfItemsToSkip();
for ( int i = skip; i < bigList.size(); i++ ) {
    MyThing = list.get(i);
    // do stuff
}

如果您使用的是ArrayList,那么这样就可以了,如果您使用的是LinkedList则会更糟。

答案 3 :(得分:0)

您可以手动完成,将迭代保存在跳过的项目上。

int skip = getNumberOfItemsToSkip();
int count = 0;

for(int i=0;i<bigList.size();i++){
  if(i >= skip){
    MyThing elem = bigList.get(i);
    //do stuff
  }else{
    i=i+skip-1;
  }
}

答案 4 :(得分:0)

subList将保持所有内容的顺序相同(结束索引是独占的,因此您需要使用bigList.subList(skip, bigList.size());

但是ListIterator会在没有开销的情况下完成它

int skip = getNumberOfItemsToSkip();
int count = 0;
for(Iterator<MyThing> it = bigList.listIterator(skip);it.hasNext();)
 MyThing thing =it.next();
  //do stuff
}

另一种方法是在你不需要的时候不创建完整的列表(这将取决于它是如何产生的)