我需要一个具有几千个元素的ArrayList,并一次处理1000个元素。所以我需要一个大的ArrayList(假设它有3500个元素)并创建具有1000个最大元素的新ArrayList。我正在使用下面的代码,但我觉得它效率不高,有什么建议吗?
import java.util.ArrayList;
import java.util.List;
public class SubList {
public static void main(String[] args) {
List<Long> ids = new ArrayList<Long>();
for(int i=0; i<3500; i++){
ids.add(Long.valueOf(i));
}
int threashold=1000;
double iteration = (double)ids.size()/threashold;
int fromIndex=0;
int toIndex=threashold;
for(int i=0; i<iteration; i++){
if(i + 1 >= iteration){
toIndex = ids.size();
List<Long> list = ids.subList(fromIndex, toIndex);
processList(list);
}else{
List<Long> list = ids.subList(fromIndex, toIndex);
processList(list);
fromIndex += threashold;
toIndex += threashold;
}
}
}
private static void processList(List<Long> ids){
System.out.println("size=" + ids.size());
}
}
答案 0 :(得分:1)
我在类ArrayList(表单openjdk)中检查了方法子列表的实现。
public List<E> More ...subList(int fromIndex, int toIndex) {
subListRangeCheck(fromIndex, toIndex, size);
return new SubList(this, 0, fromIndex, toIndex);
}
返回的类不是ArrayList的实例,而是一个名为SubList的内部类的实例。
SubList(AbstractList<E> parent,
int offset, int fromIndex, int toIndex) {
this.parent = parent;
this.parentOffset = fromIndex;
this.offset = offset + fromIndex;
this.size = toIndex - fromIndex;
this.modCount = ArrayList.this.modCount;
}
SubList存储与原始ArrayList的关系并使用它而不是制作一个简单的副本,因此它应该与原始ArrayList一样高效,并且子列表是在恒定时间内创建的。
所以,你的实现可能没问题。
答案 1 :(得分:1)
我使用String列表做类似的事情。我已将它转换为Long为你。它基本上是一个列表副本,除非它达到阈值,它存储列表并启动一个新列表。它不像你的那样处理内联列表。但这是一个“整洁”的方法..
public static List<List<Long>> getSubLists(List<Long> list, int size) {
List<List<Long>> outer = new ArrayList<List<Long>>();
List<Long> subList = new ArrayList<Long>(size);
for (Long l : list) {
subList.add(l);
if (subList.size() >= size) {
outer.add(subList);
subList = new ArrayList<Long>(size);
}
}
if (subList.size() > 0) {
outer.add(subList);
}
return outer;
}