You need to enable JavaScript to run this app. Java中如何使用Stream实现字符串数组转数字排序后求前缀和总和
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何使用Stream实现字符串数组转数字排序后求前缀和总和

解法思路

你原来的Stream写法只是对排序后的元素做了一次全量求和,要得到前缀和累加的目标结果,有两种可行的实现方式:

  • 思路1:完全对齐原始双重循环逻辑,先遍历计算每一步的前缀和,再对所有前缀和求和
  • 思路2(性能更优):排序后索引为i(从0开始计数)的元素,会在数组总长度 - i个前缀和中出现,直接给每个元素乘以对应出现次数再求和即可,无需额外存储前缀和数组

思路2代码实现(推荐)

import java.util.concurrent.atomic.AtomicInteger;
import static java.util.Arrays.stream;

public class Test {
    public static void main(String[] args) {
        String[] strings = {"3", "1", "4", "3", "2"};
        int arrLen = strings.length;
        AtomicInteger index = new AtomicInteger(0);
        int result = stream(strings)
                .mapToInt(Integer::parseInt)
                .sorted()
                .map(num -> num * (arrLen - index.getAndIncrement()))
                .sum();
        System.out.println(result); // 输出32
    }
}

说明:这里用AtomicInteger记录当前遍历索引,是因为Java lambda表达式不允许引用外部非final的普通变量,用原子类存储可变索引是常规实现方案。

思路1代码实现(对齐原始逻辑)

import static java.util.Arrays.stream;

public class Test {
    public static void main(String[] args) {
        String[] strings = {"3", "1", "4", "3", "2"};
        int[] sortedArr = stream(strings)
                .mapToInt(Integer::parseInt)
                .sorted()
                .toArray();
        // 用长度为1的数组存储前缀和变量,解决lambda不能引用可变普通变量的问题
        int[] prefixSum = {0};
        int result = stream(sortedArr)
                .map(num -> {
                    prefixSum[0] += num;
                    return prefixSum[0];
                })
                .sum();
        System.out.println(result); // 输出32
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 09:45:04