How to split a list into a given number of lists, taking the elements in order and distributing them to the sub-lists (so not partitioning the list)?
I would like to do this as "nice" as possible (using Java 8 features or Guava or something similar.
- Example list:
[1 2 3 4 5 6 7]
- Should be split in 3 :
[1 4 7]
[2 5]
[3 6]
- Should be split in 2 :
[1 3 5 7]
[2 4 6]
If the source list supports efficient random access, like ArrayList
does, you can use
IntStream.range(0, source.size()).boxed()
.collect(groupingBy(i->i%listCount, LinkedHashMap::new, mapping(source::get, toList())));
e.g.
List<Integer> source=IntStream.range(0, 20).boxed().collect(toList());
System.out.println(source);
int listCount=5;
Map<Integer, List<Integer>> 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<List<Integer>> 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]
Something like this could put all your lists into a map, then you just need to get the sub-lists out of the map
int count = 0;
Map<Integer, List<Integer>> mapLists = list.stream()
.peek(i -> count ++)
.collect(Collectors.groupingBy(i -> count % numOfSubLists))
Another way using Guava
https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/Lists.html#partition(java.util.List,%20int)
List<List<Integer>> lists = Lists.partition(list, noOfPartitions);