求助:实现计算商品平均价格与购物篮平均成本的静态方法
问题与代码修正
需求
需实现两个静态方法:
- 计算所有购物篮中商品的平均价格:总商品总价 ÷ 总商品数量
- 计算购物篮的平均成本:所有购物篮总价 ÷ 购物篮数量
现有代码
Basket类
public class Basket { private static int count = 0; private String items = ""; private int totalPrice = 0; private double totalWeight = 0; private int limit; public static int allprice = 0; public static int allcount = 0; public static int averagebasket = 0; public Basket() { increaseCount(1); items = "Список товаров:"; this.limit = 1000000; } public Basket(int limit) { this(); this.limit = limit; } public Basket(String items, int totalPrice) { this(); this.items = this.items + items; this.totalPrice = totalPrice; } public static int getCount() { return count; } public static int getAllTovar() { return allcount; } public static int getAllPrice() { return allprice; } public static int getAverageBasket() { return averagebasket; } public double getTotalWeight(){ return totalWeight; } public static void increaseCount(int count) { Basket.count = Basket.count + count; } public static void increaseTovar(int count) { Basket.allcount = Basket.allcount + count; } public static void increasePrice(int totalPrice) { Basket.allprice = Basket.allprice + totalPrice; } public static void average() { Basket.averagebasket = allprice / allcount; } public void add(String name, int price, double weight) { add(name, price, 1, weight); } public void add(String name, int price, int count, double weight) { boolean error = false; if (contains(name)) { error = true; } if (totalPrice + count * price >= limit) { error = true; } if (error) { System.out.println("Error occured :("); return; } increaseTovar(1); items = items + "\n" + name + " - " + count + " шт. - " + price + " Вес - " + totalWeight; totalPrice = totalPrice + count * price; totalWeight = totalWeight + weight; Basket.allprice += price * count; } public void clear() { items = ""; totalPrice = 0; } public int getTotalPrice() { return totalPrice; } public boolean contains(String name) { return items.contains(name); } public void print(String title) { System.out.println(title); if (items.isEmpty()) { System.out.println("Корзина пуста"); } else { System.out.println(items); } } }
Main类
public class Main { public static void main(String[] args) { Basket basket = new Basket(); basket.add("Milk", 40, 305.4); basket.print("Milk"); //System.out.println(Basket.getCount()); Basket vasya = new Basket(); basket.add("bread", 60, 555); System.out.println(Basket.getAllTovar()); System.out.println((Basket.getAllPrice())); System.out.println(Basket.getAverageBasket()); } }
问题分析
- 商品数量统计错误:
add方法中调用increaseTovar(1),实际应传入商品数量count,而非固定1; - 平均计算逻辑缺失:仅有的
average()方法无法满足两个需求,且整数除法会丢失精度; - 静态变量冗余:
averagebasket存储计算结果易导致数据不一致,应改用方法实时计算; - 构造函数统计遗漏:带
items和totalPrice的构造函数未更新全局总价和商品数量统计。
修正后的代码
Basket类
public class Basket { private static int basketCount = 0; private String items = ""; private int totalPrice = 0; private double totalWeight = 0; private int limit; private static int totalAllPrice = 0; private static int totalItemCount = 0; public Basket() { basketCount++; items = "Список товаров:"; this.limit = 1000000; } public Basket(int limit) { this(); this.limit = limit; } public Basket(String items, int totalPrice) { this(); this.items = this.items + items; this.totalPrice = totalPrice; // 更新全局统计 totalAllPrice += totalPrice; // 假设构造传入的items每个商品数量为1,可根据实际逻辑调整 totalItemCount += items.split("\n").length; } public static int getBasketCount() { return basketCount; } public static int getTotalAllPrice() { return totalAllPrice; } public static int getTotalItemCount() { return totalItemCount; } public double getTotalWeight(){ return totalWeight; } // 计算所有商品的平均价格 public static double calculateAverageItemPrice() { if (totalItemCount == 0) { return 0.0; } return (double) totalAllPrice / totalItemCount; } // 计算购物篮的平均成本 public static double calculateAverageBasketCost() { if (basketCount == 0) { return 0.0; } return (double) totalAllPrice / basketCount; } public void add(String name, int price, double weight) { add(name, price, 1, weight); } public void add(String name, int price, int count, double weight) { boolean error = false; if (contains(name)) { error = true; } if (totalPrice + count * price >= limit) { error = true; } if (error) { System.out.println("Error occured :("); return; } // 更新全局商品数量 totalItemCount += count; items = items + "\n" + name + " - " + count + " шт. - " + price + " Вес - " + (totalWeight + weight); totalPrice = totalPrice + count * price; totalWeight = totalWeight + weight; // 更新全局总价 totalAllPrice += price * count; } public void clear() { // 清除时需从全局统计中扣除当前购物篮的数据 totalAllPrice -= totalPrice; // 按换行分割计算当前商品数量(排除初始行) int currentItemCount = items.equals("Список товаров:") ? 0 : items.split("\n").length - 1; totalItemCount -= currentItemCount; items = "Список товаров:"; totalPrice = 0; totalWeight = 0; } public int getTotalPrice() { return totalPrice; } public boolean contains(String name) { return items.contains(name); } public void print(String title) { System.out.println(title); if (items.equals("Список товаров:")) { System.out.println("Корзина пуста"); } else { System.out.println(items); } } }
Main类(调用示例)
public class Main { public static void main(String[] args) { Basket basket = new Basket(); basket.add("Milk", 40, 305.4); basket.print("第一个购物篮"); Basket vasyaBasket = new Basket(); vasyaBasket.add("bread", 60, 2, 555); vasyaBasket.print("第二个购物篮"); System.out.println("总商品数量: " + Basket.getTotalItemCount()); System.out.println("所有购物篮总价: " + Basket.getTotalAllPrice()); System.out.println("商品平均价格: " + Basket.calculateAverageItemPrice()); System.out.println("购物篮平均成本: " + Basket.calculateAverageBasketCost()); // 测试清空购物篮 basket.clear(); basket.print("清空后的第一个购物篮"); System.out.println("清空后商品平均价格: " + Basket.calculateAverageItemPrice()); } }
关键改进点
- 重命名静态变量为更清晰的名称,提升可读性;
- 新增两个静态方法分别实现需求,用浮点除法保证精度;
- 修正
add方法中商品数量的统计逻辑; - 在
clear方法中同步更新全局统计数据,避免数据不一致; - 处理除数为0的边界情况,避免运行时异常。
内容的提问来源于stack exchange,提问作者flameprofi
相关产品推荐
相关产品推荐

