如何基于子数组中的价格元素对从文件读取的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
相关产品推荐
相关产品推荐

