You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Java Stream API将累积数组转换为差分数组?

用Java Stream API将累积数组转换为差值数组

给定累积数组:

[0,1,3,6,10,15,21,28,36]

需要将其转换为每个元素为当前值与前一个值差值的数组:

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

转换规则为:

value = [n] - [n-1]

可以通过Java Stream API实现这个转换,先分析你的两次尝试问题,再给出正确实现:

你的代码尝试问题分析

  • 尝试1:仅将数组转换为String数组,完全没有处理差值计算逻辑,无法达到转换目的。
  • 尝试2:存在多处问题:
    • skip(1)会跳过第一个输入数组,不符合需求;
    • IntStream.range(0,a.length)从索引0开始遍历,x=0时x-1会导致数组越界;
    • map中的lambda没有返回值,最终得到的是List<Void>而非目标类型;
    • 直接修改原数组属于副作用操作,不符合Stream的设计原则。

正确实现方案

情况1:输入为int数组

如果处理的是int类型数组,直接用IntStream即可完成转换:

int[] cumulative = {0, 1, 3, 6, 10, 15, 21, 28, 36};
int[] result = IntStream.range(0, cumulative.length)
    .map(i -> i == 0 ? cumulative[i] : cumulative[i] - cumulative[i-1])
    .toArray();

情况2:输入为String数组(匹配你的代码场景)

如果你的confirmedReader.readAll()返回的是List<String[]>,可以按以下方式处理:

List<String[]> confirmData = confirmedReader.readAll().stream()
    .map(arr -> IntStream.range(0, arr.length)
        .mapToObj(i -> {
            if (i == 0) {
                return arr[i]; // 第一个元素直接保留
            }
            int current = Integer.parseInt(arr[i]);
            int prev = Integer.parseInt(arr[i-1]);
            return String.valueOf(current - prev);
        })
        .toArray(String[]::new))
    .toList();

这个实现的核心逻辑:

  1. 遍历每个输入的String数组;
  2. 对数组的每个索引,判断是否为第一个元素:
    • 第一个元素直接保留;
    • 其余元素解析为整数后计算差值,再转回String;
  3. 将处理后的元素收集为新的String数组,最终组成List。

内容的提问来源于stack exchange,提问作者Ming Tang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 09:27:39