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

求助:实现计算商品平均价格与购物篮平均成本的静态方法

问题与代码修正

需求

需实现两个静态方法:

  • 计算所有购物篮中商品的平均价格:总商品总价 ÷ 总商品数量
  • 计算购物篮的平均成本:所有购物篮总价 ÷ 购物篮数量

现有代码

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());
    }
}

问题分析

  1. 商品数量统计错误:add方法中调用increaseTovar(1),实际应传入商品数量count,而非固定1;
  2. 平均计算逻辑缺失:仅有的average()方法无法满足两个需求,且整数除法会丢失精度;
  3. 静态变量冗余:averagebasket存储计算结果易导致数据不一致,应改用方法实时计算;
  4. 构造函数统计遗漏:带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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:45:40