我正在使用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
}
还有其他方法吗?
答案 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
}
另一种方法是在你不需要的时候不创建完整的列表(这将取决于它是如何产生的)