如何使用ArrayList根据指定token对票务文件排序并在JTextArea展示
解决方案
现有代码问题说明
- 你在读取文件的循环中就直接调用
area.append(ticket.toString()),此时所有票务还未完成加载和排序,输出的自然是未排序的内容 - 空的
catch (Exception e)块会吃掉所有报错,导致你看不到数组越界、格式转换异常等问题,不利于调试 - 你写的遍历找最大值的逻辑只能拿到最高票价,无法完成全列表排序
正确实现步骤
1. 排序逻辑实现
你可以直接用Collections.sort()配合自定义比较器实现按票价排序,这里需要注意将存储为String类型的票价转为数值类型比较:
如果是Java 8及以上版本,用lambda写法最简单:
// 按票价升序排序(如果要降序就把o1和o2的位置反过来) Collections.sort(ticketsList, (o1, o2) -> { Float price1 = Float.parseFloat(o1.getTicketPrice()); Float price2 = Float.parseFloat(o2.getTicketPrice()); return price1.compareTo(price2); });
如果是Java 8以下版本,用匿名内部类写法:
Collections.sort(ticketsList, new Comparator<Ticket>() { @Override public int compare(Ticket o1, Ticket o2) { Float price1 = Float.parseFloat(o1.getTicketPrice()); Float price2 = Float.parseFloat(o2.getTicketPrice()); return price1.compareTo(price2); } });
注意:如果对金额精度要求高,建议把票价字段存为BigDecimal类型,避免Float的浮点精度丢失问题,比较时用
BigDecimal.compareTo()即可。
2. 将排序后内容输出到JTextArea
排序完成后,先清空原有内容,再遍历排序后的列表逐行追加:
// 清空JTextArea原有内容 area.setText(""); // 遍历排序后的列表输出 for (Ticket t : ticketsList) { area.append(t.toString() + "\n"); }
3. 修正后的完整方法参考
private void loadFromFile(String fileName) { ArrayList<Ticket> ticketsList = new ArrayList<>(); float totalTicketCost = 0.00f; int numberOfLines = 0; DecimalFormat df = new DecimalFormat(); df.setMaximumFractionDigits(2); try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) { String line; String[] tokens; // 推荐用readLine() != null判断读取结束,比ready()更可靠 while ((line = reader.readLine()) != null) { tokens = line.split("\t"); if (tokens.length == 9) { Ticket ticket = new Ticket(tokens[0], tokens[1], tokens[2], tokens[3], tokens[4], tokens[5],tokens[6], tokens[7], tokens[8]); ticketsList.add(ticket); totalTicketCost += Float.parseFloat(tokens[5]); numberOfLines++; } } // 统计值赋值 numberOfTickets.setText(String.valueOf(numberOfLines)); totalCost.setText(df.format(totalTicketCost)); // 排序逻辑 Collections.sort(ticketsList, (o1, o2) -> { Float price1 = Float.parseFloat(o1.getTicketPrice()); Float price2 = Float.parseFloat(o2.getTicketPrice()); return price1.compareTo(price2); }); // 输出排序后内容到JTextArea area.setText(""); for (Ticket ticket : ticketsList) { area.append(ticket.toString() + "\n"); } } catch (Exception e) { // 不要留空catch块,至少打印异常方便调试 e.printStackTrace(); } }
内容的提问来源于stack exchange,提问作者Jonathan Baxevanidis
相关产品推荐
相关产品推荐

