我有一种情况,我们将List传递给一个处理方法。我们现在需要确保在任何给定时间只传递包含40个项目的列表。换句话说,如果列表有100个项目,那么它应该通过传递包含40个项目的列表来调用该方法,然后再次传递40个项目然后再传递20个项目。如何实现此行为?一些例子非常有用。
答案 0 :(得分:3)
这样的东西应该没有生成一个子列表列表的开销:
void process(List<Thing> list) {
final int len = list.size();
if (len > 40) {
int start = 0;
do {
final end = Math.min(len, start + 40);
process(list.sublist(start, end);
start = end;
} while (start < len);
} else {
// process list of length <= 40 here
}
}
答案 1 :(得分:2)
使用Guava,这是stupidly simple:
List<Foo> foos = /* whatever */;
for (List<Foo> part : Lists.partition(foos, 40))
{
doSomethingWith(part);
}
答案 2 :(得分:1)
Guava的Lists.partition(List<E>, int)
将指定List
块指定到指定大小的子列表中,这听起来非常适合您的用例。
答案 3 :(得分:1)
这是一个纯Java示例:
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 100; i++) {
list.add(i);
}
for (int i = 0; i < (list.size()/40.0); i++) {
maxForty(list.subList(i * 40, Math.min(((i + 1) * 40), list.size())));
}
}
public static void maxForty(List<Integer> list) {
System.out.println("List size: " + list.size());
}
打印出来:
List size: 40
List size: 40
List size: 20
答案 4 :(得分:0)
在调用方法之前,请测试列表的大小。如果它高于40,你可以启动一个循环,创建一个包含40个项目(最大值)的新列表,并将该列表作为方法调用参数传递。
答案 5 :(得分:0)
Google的Guava有一个方法Lists.partition,它接受一个List和一个分区大小,并返回一个列表列表。举个例子:
List<Foo> fooList = new ArrayList<Foo>();
//add 100 items to fooList
List<List<Foo>> partitionedFoos = Lists.partition(fooList, 40);
//A List containing 3 lists, the first two with 40 Foos, the last with 20.
for(List<Foo> foos : paritionedFoos){
bar(foos);
}