2016-10-06 17 views
2

如何将一个列表拆分成给定数目的列表,将这些元素按顺序排列并将它们分配给子列表(这样就不会对列表进行分区)?如何将列表分配到子列表中,保持元素的原始顺序?

我想这样做,因为“漂亮”越好(使用Java 8的功能或番石榴或类似的东西

  • 列表示例:[1 2 3 4 5 6 7]
  • 应在3个被分割:[1 4 7][2 5][3 6]
  • 应在2分裂:[1 3 5 7][2 4 6]
+0

如何元素分发到各自分区? – Flown

+0

@从第1个元素到第1个子列表,第2个元素到第2个子列表,第3个元素到第1个子列表等(在2个子列表的例子中);只需从原始列表中按顺序将它们按顺序分发到子列表 – Belun

回答

10

如果源列表,以获得子列表出来的图

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

的另一种方式支持高效随机存取,如ArrayList呢,可以用

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

例如

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] 
+0

我喜欢这个,我一直在努力思考如何在流内保持计数 – Ash

+0

你甚至可以避免拳击整数从0到n通过使用标准的集合'IntStream',虽然它似乎有点矫枉过正:'.collect(LinkedHashMap :: new,(m,i) - > m.computeIfAbsent(i%size,k - > new ArrayList <>())。add(list.get(i)),(m1,m2) - > m2.forEach((k,v) - > m1.merge(k,v,(l1,l2) - > {l1.addAll(l2); return l1;})));' –

+1

@Alexis C:这就是我想要避免的地方。特别是合并功能。遗憾的是'Map.mergeAll'已被遗忘...... – Holger

0

像这样的东西可以把你所有的列表成图,那么你只需要使用番石榴

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); 
+0

Guava Lists.partition - 返回列表的连续子列表。不是我想要的。我需要他们以其他方式分发。关于peek解决方案,groupBy解决方案可能会工作 – Belun

+0

:peek是用于调试而不是与数据混淆(也许可以使用map(),但不适用于外部可变变量) – Belun

+0

您可能可以摆脱偷看,只是通过做这样的'groupingBy(i - > ++ count%numberOfSubLists)'groupingBy修改计数' – Ash

相关问题