将列表拆分为列表列表

时间:2017-12-12 15:21:45

标签: java

我们说我有一个List<Object>,其中包含100个对象。使用Java 8(没有任何tierce库)获得List<List<Object>>包含10 List 10 Object的最佳方式是什么?

4 个答案:

答案 0 :(得分:2)

您需要一个外部final计数器,但这似乎有效。

    // Must be final (or implicitly final). 
    AtomicInteger n = new AtomicInteger();
    Map<String, List<Integer>> groups = IntStream.range(0, 100)
            .boxed()
            .collect(Collectors.groupingBy(
                    // Group by n / 10.
                    o -> String.valueOf(n.getAndIncrement() / 10)
                    )
            );

答案 1 :(得分:1)

我首先考虑chuck大小(在你的情况下为10个元素),然后查看列表并使用subList从中取出块。 E.g:

List<List<Object>> subLists = IntStream
    .range(0, (int) Math.ceil((double) list.size() / subListSize))
    .mapToObj(i -> new ArrayList<>
                       (list.subList(i * subListSize, (i + 1) * subListSize)))
    .collect(Collectors.toList());

注意: 如果double没有完全划分subListSize,则list.size()和天花板的转换是为了避免整数除法。

答案 2 :(得分:1)

使用番石榴更简单(你在帖子without any tierce library中提到我无论如何都把它放了)

@Test
public void givenList_whenParitioningIntoNSublists_thenCorrect() {
    List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8);
    List<List<Integer>> subSets = Lists.partition(intList, 3);

    List<Integer> lastPartition = subSets.get(2);
    List<Integer> expectedLastPartition = Lists.<Integer> newArrayList(7, 8);
    assertThat(subSets.size(), equalTo(3));
    assertThat(lastPartition, equalTo(expectedLastPartition));
}

答案 3 :(得分:1)

在java 9中,您可以使用takeWhile使用IntStream生成索引,然后使用这些索引从原始列表中获取子列表。 这适用于任何对象列表

private static final int BATCH_SIZE = 10;

public void test(){
    List<List<Object>> batchedLists = split(generateTestObjects());
}

public List<List<Object>> split(List<Object> objects) {
    return IntStream.iterate(0, n -> n + BATCH_SIZE)
            .takeWhile(n -> n < objects.size())
            .map(t -> objects.subList(t, Math.min(t + BATCH_SIZE, objects.size()))
            .collect(Collectors.toList());
}

public List<Object> generateTestObjects(){
    return IntStream.range(0, 100)
            .boxed()
            .collect(Collectors.toList());
}