将列表拆分为带有流的n-size的较小列表

时间:2017-12-04 17:33:47

标签: java

如何使用流来获取Java列表并将其拆分为Java中较小的大小为n的列表?

在JavaScript中,我使用reduce()函数并执行以下操作:



const n = 3;
const sublists = [1,2,3,4,5,6,7,8,9,0]
  .reduce((r, i) => {
    r[r.length - 1].length == n 
      ? r.push([i])
      : r[r.length - 1].push(i);
    return r;
  }, [[]]);
console.log(sublists);




我试图用Java流做到这一点,但我似乎无法弄清楚如何让我使用ArrayList<ArrayList<Integer>>作为我的初始值,然后添加名单。我有点困惑组合器和累加器如何使用它们,或者即使reduce()是Java的最佳方法。

2 个答案:

答案 0 :(得分:2)

看起来你有一个JavaScript数组,所以等效的Java代码可能会使用IntStream。首先,计算rows的正确数量,然后使用Arrays.copyOfRange收集到List,然后转换为int[][]。最后,使用Arrays.deepToString打印数组。喜欢,

final int n = 3;
int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
int rows = 1 + arr.length / n;
int[][] sublists = IntStream.range(0, rows)
        .mapToObj(i -> 
                Arrays.copyOfRange(arr, n * i, Math.min(n + (n * i), arr.length)))
        .collect(Collectors.toList()).toArray(new int[rows][n]);
System.out.println(Arrays.deepToString(sublists));

哪个输出

[[1, 2, 3], [4, 5, 6], [7, 8, 9], [0]]

对于List<Integer>,可能会像

那样完成
final int n = 3;
List<Integer> arr = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
int rows = 1 + arr.size() / n;
List<List<Integer>> sublists = IntStream.range(0, rows)
        .mapToObj(i -> arr.subList(n * i, Math.min(n + (n * i), arr.size())))
        .collect(Collectors.toList());
System.out.println(sublists);

表示相同(请求)的输出。

答案 1 :(得分:1)

非常简单:

$('#tile-store')

Java 8解决方案:

    List<Integer> list = List.of(1, 2, 3, 4, 5, 7, 8, 9, 10, 11);
    int n = 3;
    List<List<Integer>> result = new LinkedList<>();
    int size = list.size();
    for (int i = 0; i <= size; i += n) {
        result.add(list.subList(i, Math.min(i + n, size)));
    }        
    System.out.println(result);  // [[1, 2, 3], [4, 5, 7], [8, 9, 10], [11]]