java - 使用流将列表拆分为 n 大小的较小列表

标签 java

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

在 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 的最佳方法。

最佳答案

看起来您有一个 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);

对于相同的(请求的)输出。

关于java - 使用流将列表拆分为 n 大小的较小列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47638892/

相关文章:

java - 如何压缩文件夹并在android中通过电子邮件发送

java - 为什么在java中我们不能通过一个扫描器对象获取用户输入的int和string?

java - 将 imageview 放置在 mapfragment/mapview 之上

java - 了解java中的acessOrder LinkedHashMap实现

Java卡片布局不显示文本区域

java - 创建链接列表的链接列表时出错

构造函数或方法中的 Java arraylist 初始化

java - Openshift 使用 JBoss EAP 连接到套接字

java - 使用 FileInputStream 时出现 FileNotFoundException

java - Eclipse java继承方法和字段