使用Map实现商品销售统计系统,通过键值对高效记录商品销量与销售额。示例中初始化商品价格,利用HashMap存储商品名与销量、金额的映射,每次销售时更新对应数据,最后打印汇总报表。进阶方案引入自定义对象ProductStats统一管理数量和金额,提升代码可扩展性。该练习涵盖Map基本操作、数据聚合、控制台输入处理等核心技能。

在Java新手项目中,搭建一个简单的商品销售统计系统是掌握基础数据结构和逻辑处理的好方法。其中,Map 是非常关键的工具,它能帮助我们高效地统计每种商品的销售数量和销售额。
为什么用Map?
商品销售数据通常以“商品名 + 销售数量”或“商品名 + 单价 + 销售记录”的形式出现。我们需要根据商品名称进行归类和累计,而Map的键值对结构天然适合这种场景:
- 键(Key):商品名称(String)
- 值(Value):可以是销售数量(Integer)、总金额(Double),或者一个自定义对象
- 查找和更新效率高,避免重复遍历列表
基本功能设计与Map使用示例
假设我们要实现以下功能:
- 记录每笔销售
- 统计每个商品的总销量
- 计算每个商品的总销售额
- 打印销售报表
示例代码片段:
立即学习“Java免费学习笔记(深入)”;
import java.util.HashMap; import java.util.Map; import java.util.Scanner;public class SalesSystem { // 使用Map存储商品名称到销售信息的映射 private Map
salesCount; // 商品 -> 销量 private Map salesAmount; // 商品 -> 总销售额 private Map priceList; // 商品 -> 单价(模拟价格表) public SalesSystem() { salesCount = new HashMap<>(); salesAmount = new HashMap<>(); priceList = new HashMap<>(); // 初始化一些商品价格 priceList.put("苹果", 5.0); priceList.put("香蕉", 3.0); priceList.put("橙子", 4.5); } // 记录一次销售 public void recordSale(String productName, int quantity) { if (!priceList.containsKey(productName)) { System.out.println("错误:未找到商品 " + productName); return; } double price = priceList.get(productName); // 更新销量 salesCount.put(productName, salesCount.getOrDefault(productName, 0) + quantity); // 更新总金额 salesAmount.put(productName, salesAmount.getOrDefault(productName, 0.0) + price * quantity); } // 打印销售统计 public void printReport() { System.out.println("\n=== 商品销售统计 ==="); for (String product : salesCount.keySet()) { int count = salesCount.get(product); double amount = salesAmount.get(product); System.out.printf("商品:%s | 销量:%d | 总销售额:%.2f元\n", product, count, amount); } } public static void main(String[] args) { SalesSystem system = new SalesSystem(); Scanner scanner = new Scanner(System.in); System.out.println("请输入销售记录(格式:商品名 数量),输入'quit'退出:"); while (true) { String line = scanner.nextLine(); if (line.equals("quit")) break; String[] parts = line.split(" "); if (parts.length != 2) { System.out.println("格式错误,请输入:商品名 数量"); continue; } try { String name = parts[0]; int qty = Integer.parseInt(parts[1]); system.recordSale(name, qty); } catch (NumberFormatException e) { System.out.println("数量必须是整数"); } } system.printReport(); scanner.close(); }}
进阶思路:使用自定义对象优化结构
当需求变复杂(比如还要记录库存、分类、销售时间等),可以把值类型升级为对象:
class ProductStats { int quantity; double amount;public ProductStats(int quantity, double amount) { this.quantity = quantity; this.amount = amount; }} // 然后使用 Map
来统一管理 这样代码更清晰,扩展性更强。
小结
通过这个小项目,你可以学到:
- Map的基本增删改查操作
- getOrDefault 的巧妙用法,避免空指针
- 如何用Map做数据聚合和统计
- 从控制台读取输入并处理简单业务逻辑
基本上就这些,不复杂但很实用。掌握了这个模式,以后做日志分析、用户行为统计也都能举一反三。










