如何使用流来获取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的最佳方法。
答案 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]]