如何用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
相关产品推荐
相关产品推荐

