📜  门| GATE CS 2020 |第 46 题(1)

📅  最后修改于: 2023-12-03 14:58:20.885000             🧑  作者: Mango

GATE CS 2020 | Question 46

这是 GATE CS 2020 的第 46 道题。它是一道编程题,要求编写代码实现一个系统,用于维护商品库存信息。以下是该系统的要求:

  • 该系统应支持一个商品的名称、库存数量和价格数据。
  • 库存数据应该根据商品名称进行索引,因此必须支持使用商品名称进行查找、更新和删除操作。
  • 库存的数量和价格应该可以修改。
  • 库存数据应该可以以某一列(名称、数量或价格)进行排序,并且支持升序和降序排序。
  • 库存数据应该可以以 CSV 格式从文件或流中读取或写入。CSV 的第一行应该是标题行,包含商品名称、库存数量和价格字段。

以下是实现该系统所需的代码片段。

实现商品类

首先,我们需要实现一个商品类(Item),用于存储每个商品的信息。

public class Item {
    private String name;
    private int quantity;
    private double price;

    // 构造函数
    public Item(String name, int quantity, double price) {
        this.name = name;
        this.quantity = quantity;
        this.price = price;
    }

    // 获取商品名称
    public String getName() {
        return name;
    }

    // 获取库存数量
    public int getQuantity() {
        return quantity;
    }

    // 获取商品价格
    public double getPrice() {
        return price;
    }

    // 设置库存数量
    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    // 设置商品价格
    public void setPrice(double price) {
        this.price = price;
    }

    // 重写 toString 方法
    @Override
    public String toString() {
        return String.format("%s, %d, %.2f", name, quantity, price);
    }
}
实现库存类

下一步,我们需要实现一个库存类(Inventory),用于维护商品库存信息。

import java.util.*;

public class Inventory {
    private Map<String, Item> items;

    // 构造函数
    public Inventory() {
        this.items = new HashMap<>();
    }

    // 添加商品到库存
    public void add(Item item) {
        items.put(item.getName(), item);
    }

    // 更新库存中的商品信息
    public void update(String name, int quantity, double price) {
        if (items.containsKey(name)) {
            Item item = items.get(name);
            item.setQuantity(quantity);
            item.setPrice(price);
        }
    }

    // 从库存中删除商品
    public void remove(String name) {
        items.remove(name);
    }

    // 按商品名称获取商品信息
    public Item get(String name) {
        return items.get(name);
    }

    // 按名称、数量或价格进行排序
    public List<Item> sort(String column, boolean ascending) {
        List<Item> sortedItems = new ArrayList<>(items.values());
        Comparator<Item> comparator;

        switch (column) {
            case "name":
                comparator = Comparator.comparing(Item::getName);
                break;
            case "quantity":
                comparator = Comparator.comparingInt(Item::getQuantity);
                break;
            case "price":
                comparator = Comparator.comparingDouble(Item::getPrice);
                break;
            default:
                throw new IllegalArgumentException("Invalid column: " + column);
        }

        if (!ascending) {
            comparator = comparator.reversed();
        }

        sortedItems.sort(comparator);

        return sortedItems;
    }

    // 从输入流中读取 CSV 文件并加入到库存中
    public void readCsv(InputStream input) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(input));

        // 读取标题行
        String line = reader.readLine();
        String[] headers = line.split(",");

        // 逐行读取数据并添加到库存中
        while ((line = reader.readLine()) != null) {
            String[] fields = line.split(",");
            Item item = new Item(fields[0], Integer.parseInt(fields[1]), Double.parseDouble(fields[2]));
            add(item);
        }

        reader.close();
    }

    // 将库存的内容以 CSV 格式写入输出流
    public void writeCsv(OutputStream output) throws IOException {
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output));

        // 写入标题行
        writer.write("name,quantity,price\n");

        // 逐行写入数据
        for (Item item : items.values()) {
            writer.write(item.toString() + "\n");
        }

        writer.close();
    }
}
使用示例

最后,以下是一个使用上述类的示例:

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        // 初始化库存
        Inventory inventory = new Inventory();

        // 从文件中读取商品数据并加入到库存中
        InputStream input = new FileInputStream("inventory.csv");
        inventory.readCsv(input);
        input.close();

        // 更新商品信息
        inventory.update("apple", 15, 1.5);

        // 排序库存
        for (Item item : inventory.sort("name", true)) {
            System.out.println(item);
        }

        // 将库存数据写入到文件中
        OutputStream output = new FileOutputStream("inventory_updated.csv");
        inventory.writeCsv(output);
        output.close();
    }
}

以上代码演示了如何从 CSV 文件读取商品数据、更新商品信息并排序库存,最后将更新后的数据写入到文件中。