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

如何基于子数组中的价格元素对从文件读取的Java二维字符串数组进行排序

解决方案:按商品价格数值排序你的商品条目

嗨,刚接触Java遇到这种类型转换+排序的问题太正常了,我来一步步帮你解决~

首先,先说说你当前代码的小问题:直接用二维字符串数组处理数据虽然能行,但后续操作(比如排序、修改属性)会很麻烦,而且容易出错。更推荐的方式是创建一个商品实体类来封装每条数据,这样代码可读性和维护性都会好很多。当然,如果你想基于现有代码直接修改,我也会提供对应的方法。


方法一:使用实体类(推荐)

步骤1:创建商品实体类 Item

这个类用来存储每条商品的信息,包含id、名称、价格、类别四个属性,并且提供构造方法和getter:

class Item {
    private String id;
    private String name;
    private double price;
    private String category;

    public Item(String id, String name, double price, String category) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.category = category;
    }

    // Getter方法,用于排序时获取价格
    public double getPrice() {
        return price;
    }

    // 重写toString方便打印结果
    @Override
    public String toString() {
        return id + ", " + name + ", " + price + ", " + category;
    }
}

步骤2:修改文件读取逻辑,转换成Item对象列表

把原本读取字符串数组的逻辑改成读取并转换成Item对象,同时用try-with-resources自动关闭IO资源(避免手动关闭遗漏):

void sortPrice() throws IOException {
    // 用try-with-resources自动关闭BufferedReader,不用手动调用close()
    try (BufferedReader br = new BufferedReader(new FileReader("items.txt"))) {
        List<Item> itemList = new ArrayList<>();
        String line;
        while ((line = br.readLine()) != null) {
            String[] currentLine = line.split(",");
            // 注意去掉每个字段的前后空格(你的数据里有些字段带空格,比如" 8.5")
            String id = currentLine[0].trim();
            String name = currentLine[1].trim();
            // 把价格字符串转成double类型
            double price = Double.parseDouble(currentLine[2].trim());
            String category = currentLine[3].trim();
            itemList.add(new Item(id, name, price, category));
        }

        // 按价格升序排序:用lambda表达式简化Comparator
        Collections.sort(itemList, (item1, item2) -> Double.compare(item1.getPrice(), item2.getPrice()));
        // 也可以用Java 8+的Stream API排序
        // List<Item> sortedList = itemList.stream().sorted(Comparator.comparingDouble(Item::getPrice)).collect(Collectors.toList());

        // 打印排序后的结果
        System.out.println("按价格升序排序后的商品:");
        for (Item item : itemList) {
            System.out.println(item);
        }
    }
}

方法二:直接对二维字符串数组排序(适配现有代码)

如果你不想创建实体类,也可以直接对String[][]数组排序,核心是在比较的时候把第三个元素转换成数值类型再比较:

void sortPrice() throws IOException {
    try (BufferedReader br = new BufferedReader(new FileReader("items.txt"))) {
        List<String[]> lines = new ArrayList<>();
        String line;
        while ((line = br.readLine()) != null) {
            String[] currentLine = line.split(",");
            // 先去掉每个字段的前后空格,避免转数字时出错
            for (int i = 0; i < currentLine.length; i++) {
                currentLine[i] = currentLine[i].trim();
            }
            lines.add(currentLine);
        }

        String[][] strings = lines.toArray(new String[lines.size()][]);

        // 对二维数组排序:自定义Comparator,把第三个元素转成Double比较
        Arrays.sort(strings, (arr1, arr2) -> {
            // 捕获可能的格式错误,避免程序崩溃
            try {
                double price1 = Double.parseDouble(arr1[2]);
                double price2 = Double.parseDouble(arr2[2]);
                return Double.compare(price1, price2);
            } catch (NumberFormatException e) {
                // 如果价格格式错误,默认把错误条目放后面
                return 1;
            }
        });

        // 打印排序后的结果
        System.out.println("按价格升序排序后的商品:");
        for (String[] item : strings) {
            System.out.println(String.join(", ", item));
        }
    }
}

关键注意点

  • 处理空格:你的items.txt里有些字段前后有空格(比如" 8.5"),一定要用trim()去掉,否则转数字会报错。
  • 异常处理:把字符串转成double时可能会出现NumberFormatException(比如数据格式错误),加上异常处理能避免程序直接崩溃。
  • 资源关闭:用try-with-resources语法自动关闭IO资源,这是Java推荐的安全写法,比手动关闭更可靠。

内容的提问来源于stack exchange,提问作者Trong Duong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:54:05