我有一个可以包含无限量对象的ArrayList。我需要一次拉10件物品并对它们进行操作。
我能想到的就是这个。
int batchAmount = 10;
for (int i = 0; i < fullList.size(); i += batchAmount) {
List<List<object>> batchList = new ArrayList();
batchList.add(fullList.subList(i, Math.min(i + batchAmount, fullList.size()));
// Here I can do another for loop in batchList and do operations on each item
}
有什么想法?谢谢!
答案 0 :(得分:3)
您可以这样做:
int batchSize = 10;
ArrayList<Integer> batch = new ArrayList<Integer>();
for (int i = 0; i < fullList.size();i++) {
batch.add(fullList.get(i));
if (batch.size() % batchSize == 0 || i == (fullList.size()-1)) {
//ToDo Process the batch;
batch = new ArrayList<Integer>();
}
}
您当前实现的问题是您在每次迭代时创建batchList
,您需要在循环之外声明此列表(batchList
)。类似的东西:
int batchAmount = 10;
List<List<object>> batchList = new ArrayList();
for (int i = 0; i < fullList.size(); i += batchAmount) {
ArrayList batch = new ArrayList(fullList.subList(i, Math.min(i + batchAmount, fullList.size()));
batchList.add(batch);
}
// at this point, batchList will contain a list of batches
答案 1 :(得分:1)
Guava library
提供Google
,有助于实现不同的功能。
List<Integer> countUp = Ints.asList(1, 2, 3, 4, 5);
List<Integer> countDown = Lists.reverse(theList); // {5, 4, 3, 2, 1}
List<List<Integer>> parts = Lists.partition(countUp, 2); // {{1, 2}, {3, 4}, {5}}
从https://stackoverflow.com/a/9534034/3027124和https://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Lists
中回答希望这有帮助。
答案 2 :(得分:0)
从ArrayList中提取元素:ArrayList.remove(0)
// clone the list first if you need the values in the future:
ArrayList<object> cloned = new ArrayList<>(list);
while(!list.isEmpty()){
object[] tmp = new object[10];
try{
for(int i = 0; i < 10; i++) tmp[i] = list.remove(0);
}catch(IndexOutOfBoundsException e){
// end of list reached. for loop is auto broken. no need to do anything.
}
// do something with tmp, whose .length is <=10
}