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

如何用Java 8 Stream计算非零相邻元素间的BigDecimal绝对差值

解决方案

要实现这个需求,核心逻辑是遍历列表时跳过零值,仅对连续的非零元素计算相邻的绝对差值。以下是具体实现步骤和代码示例:

关键逻辑说明

  1. 准确判断零值:BigDecimal的零可能有多种表示形式(如0、0E-4),必须用compareTo(BigDecimal.ZERO) == 0来判断,不能用equals(会受精度影响)。
  2. 跟踪连续非零序列:维护一个变量记录上一个非零元素,遇到零值时重置该变量,确保零前后的非零元素不会被错误计算差值。
  3. 计算绝对差值:对连续的非零相邻元素,用subtract计算差值后调用abs()取绝对值。

Java 代码实现

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class NonZeroAdjacentDiffCalculator {
    public static List<BigDecimal> computeNonZeroAdjacentDiffs(List<BigDecimal> input) {
        List<BigDecimal> result = new ArrayList<>();
        BigDecimal lastNonZero = null;

        for (BigDecimal num : input) {
            // 判断当前元素是否为零
            if (num.compareTo(BigDecimal.ZERO) == 0) {
                lastNonZero = null;
                continue;
            }

            // 若存在上一个非零元素,计算绝对差值
            if (lastNonZero != null) {
                BigDecimal diff = num.subtract(lastNonZero).abs();
                result.add(diff);
            }

            // 更新上一个非零元素
            lastNonZero = num;
        }

        return result;
    }

    public static void main(String[] args) {
        // 构造示例输入
        List<BigDecimal> sampleInput = List.of(
            new BigDecimal("76.2372"),
            new BigDecimal("0E-4"),
            new BigDecimal("80.2318"),
            new BigDecimal("82.1111"),
            new BigDecimal("88.0937")
        );

        List<BigDecimal> diffs = computeNonZeroAdjacentDiffs(sampleInput);
        // 输出结果:1.8793、5.9826
        diffs.forEach(System.out::println);
    }
}

测试示例验证

对于你提供的示例输入:

  • 第一个非零元素76.2372之后遇到零值,后续的80.2318会重新开始序列。
  • 80.2318与82.1111的绝对差值为1.8793,82.1111与88.0937的绝对差值为5.9826,最终结果列表包含这两个值,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:45:53