如何将列表分发到子列表中,保持元素的原始顺序?

如何将列表拆分为给定数量的列表,按顺序获取元素并将它们分发到子列表(因此不对列表进行分区)?

我想尽可能“好”(使用Java 8function或番石榴或类似的东西)。

  • 示例列表: [1 2 3 4 5 6 7]
  • 应分为3: [1 4 7] [2 5] [3 6]
  • 应分为2: [1 3 5 7] [2 4 6]

如果源列表支持有效的随机访问,就像ArrayList那样,您可以使用

 IntStream.range(0, source.size()).boxed() .collect(groupingBy(i->i%listCount, LinkedHashMap::new, mapping(source::get, toList()))); 

例如

 List source=IntStream.range(0, 20).boxed().collect(toList()); System.out.println(source); int listCount=5; Map> collect = IntStream.range(0, source.size()).boxed() .collect(groupingBy(i->i%listCount, LinkedHashMap::new, mapping(source::get, toList()))); // in case it really has to be a List: List> result=new ArrayList<>(collect.values()); result.forEach(System.out::println); 
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] [0, 5, 10, 15] [1, 6, 11, 16] [2, 7, 12, 17] [3, 8, 13, 18] [4, 9, 14, 19] 

像这样的东西可以将你的所有列表放到地图中,然后你只需要从地图中获取子列表

 int count = 0; Map> mapLists = list.stream() .peek(i -> count ++) .collect(Collectors.groupingBy(i -> count % numOfSubLists)) 

使用番石榴的另一种方式

https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/Lists.html#partition(java.util.List,%20int)

 List> lists = Lists.partition(list, noOfPartitions);