从java列表中检索一定数量的项目以进行处理

时间:2012-02-22 20:31:21

标签: java

我有一种情况,我们将List传递给一个处理方法。我们现在需要确保在任何给定时间只传递包含40个项目的列表。换句话说,如果列表有100个项目,那么它应该通过传递包含40个项目的列表来调用该方法,然后再次传递40个项目然后再传递20个项目。如何实现此行为?一些例子非常有用。

6 个答案:

答案 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);
}