Java实现按车名分组计算List<Car>元素的价格总和
需求说明
现有存储车型名称、价格属性的Car类集合,需要实现sumOfPrice方法,按车名分组统计对应价格的总和,最终输出分组累加结果,预期输出效果如下:
BMW X5 68000 BMW X3 59000
原有代码问题
先修正2个明显的逻辑错误:
- main方法中用
Map<String,Double>存储车辆数据不符合需求:Map的key具有唯一性,同车型多次调用put会覆盖之前的价格,无法保留多条同车型记录参与累加,需要改为List<Car>类型存储车辆实例 sumOfPrice是普通实例方法,main是静态方法,直接调用会编译报错,需要将方法改为静态方法,或者通过MainClass实例调用
方法实现逻辑
遍历传入的Car集合,对每台车做如下处理:
- 提取当前车辆的车型名称、价格
- 判断结果Map中是否已存在该车型的key:
- 不存在:直接将当前车型、价格存入结果Map
- 已存在:取出该车型已统计的总价,加上当前车辆的价格,再更新回结果Map
完整可运行代码
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; // Car实体类 class Car { private String name; private double price; public Car (String name, double price){ this.name = name; this.price = price; } public String getName() { return name; } public double getPrice(){ return price; } } public class MainClass { public static void main(String[] args) { // 改为List<Car>存储车辆数据,支持同车型多条记录 List<Car> carList = new ArrayList<>(); carList.add(new Car("BMW X5", 35000.00)); carList.add(new Car("BMW X5", 33000.00)); carList.add(new Car("BMW X3", 30000.00)); carList.add(new Car("BMW X3", 29000.00)); Map<String, Double> sumList = sumOfPrice(carList); // 打印结果 for (String model : sumList.keySet()) { // 转成整数输出匹配预期格式,不需要小数可直接强转 System.out.println(model + " " + (int)sumList.get(model).doubleValue()); } } // 改为static静态方法,供main方法直接调用 public static Map<String, Double> sumOfPrice(List<Car> cars) { Map<String, Double> sum = new HashMap<>(); for (Car car : cars) { String modelName = car.getName(); double price = car.getPrice(); // 核心累加逻辑 if (sum.containsKey(modelName)) { sum.put(modelName, sum.get(modelName) + price); } else { sum.put(modelName, price); } } return sum; } }
可选简化写法(Java 8+ Stream实现)
如果项目使用JDK8及以上版本,可以直接用Stream的groupingBy收集器简化实现,不需要手动写循环:
// 注意需要先导入 import java.util.stream.Collectors; public static Map<String, Double> sumOfPrice(List<Car> cars) { return cars.stream() .collect(Collectors.groupingBy( Car::getName, Collectors.summingDouble(Car::getPrice) )); }
内容的提问来源于stack exchange,提问作者Андрій Х
相关产品推荐
相关产品推荐

