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

如何用Map对ArrayList中同String对应的两个Integer求和

解决方案:按String分组对两个Integer分别求和

我来帮你搞定这个问题!你已经实现了单个Integer的求和,现在只需要把逻辑扩展到两个Integer的场景就行,核心思路还是用**Map<String, QuantityData>**来分组,为每个String维护两个Integer的累加值。下面一步步给你讲清楚:

1. 先定义正确的QuantityData类

这个类需要存储分组的String键,以及两个Integer的累加结果,还要提供累加方法方便更新值:

class QuantityData {
    private String key;
    private int sum1;
    private int sum2;

    // 构造方法:初始化键和初始值
    public QuantityData(String key, int num1, int num2) {
        this.key = key;
        this.sum1 = num1;
        this.sum2 = num2;
    }

    // 累加方法:传入两个数,分别加到对应的总和里
    public void add(int num1, int num2) {
        this.sum1 += num1;
        this.sum2 += num2;
    }

    // Getter方法和toString,方便后续获取值和输出
    public String getKey() {
        return key;
    }

    public int getSum1() {
        return sum1;
    }

    public int getSum2() {
        return sum2;
    }

    @Override
    public String toString() {
        return key + " , " + sum1 + " , " + sum2;
    }
}

2. 核心分组求和逻辑

假设你的原始数据是一个包含String, Integer, Integer的列表(比如用Object[]存储每一行数据),我们可以用Map来分组累加:

import java.util.*;

public class SumDemo {
    public static void main(String[] args) {
        // 模拟你的原始数据列表
        List<Object[]> originalList = Arrays.asList(
            new Object[]{"aaa", 1, 2},
            new Object[]{"aaa", 2, 1},
            new Object[]{"bbb", 1, 2},
            new Object[]{"ccc", 3, 3},
            new Object[]{"ccc", 1, 2},
            new Object[]{"ccc", 2, 2}
        );

        // 用Map分组:key是String,value是对应QuantityData(维护累加值)
        Map<String, QuantityData> sumMap = new HashMap<>();

        for (Object[] item : originalList) {
            String key = (String) item[0];
            int num1 = (int) item[1];
            int num2 = (int) item[2];

            // 如果Map里已有这个key,就调用add方法累加;没有则新建QuantityData
            if (sumMap.containsKey(key)) {
                sumMap.get(key).add(num1, num2);
            } else {
                sumMap.put(key, new QuantityData(key, num1, num2));
            }
        }

        // 把Map的values转成结果列表
        List<QuantityData> resultList = new ArrayList<>(sumMap.values());

        // 输出验证结果
        for (QuantityData data : resultList) {
            System.out.println(data);
        }
    }
}

运行这段代码,就能得到你想要的结果:

aaa , 3 , 3
bbb , 1 , 2
ccc , 6 , 7

3. 用Java 8 Stream简化代码(可选)

如果你的项目用Java 8及以上,还可以用Stream API来简化分组逻辑,代码更简洁:

import java.util.*;
import java.util.stream.Collectors;

public class SumStreamDemo {
    public static void main(String[] args) {
        List<Object[]> originalList = Arrays.asList(
            new Object[]{"aaa", 1, 2},
            new Object[]{"aaa", 2, 1},
            new Object[]{"bbb", 1, 2},
            new Object[]{"ccc", 3, 3},
            new Object[]{"ccc", 1, 2},
            new Object[]{"ccc", 2, 2}
        );

        // 自定义Collector来收集两个累加值
        Collector<Object[], ?, QuantityData> collector = Collector.of(
            () -> new QuantityData(null, 0, 0), // 初始化空的累加对象
            (data, item) -> { // 累加每个元素的值
                data.key = (String) item[0];
                data.add((int) item[1], (int) item[2]);
            },
            (data1, data2) -> { // 并行处理时合并两个累加对象
                data1.add(data2.sum1, data2.sum2);
                return data1;
            }
        );

        // 分组并求和
        Map<String, QuantityData> sumMap = originalList.stream()
            .collect(Collectors.groupingBy(item -> (String) item[0], collector));

        List<QuantityData> resultList = new ArrayList<>(sumMap.values());

        // 输出结果
        resultList.forEach(System.out::println);
    }
}

可能出错的地方排查

你之前失败大概率是这几个原因:

  • 没有给QuantityData定义正确的累加方法,比如直接覆盖值而不是累加
  • 初始化QuantityData时没有正确设置初始值
  • 分组时没有正确关联String和对应的两个Integer值

按照上面的代码来写,应该就能解决问题啦!

内容的提问来源于stack exchange,提问作者D.Madu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:48:40