[英]How to sort file using Arraylist according to specific token?
我有一個文件,其中包含一些關於機票發行的信息,看起來像這樣。
Test Passenger Aegean Business 06:00 Athens-London 650.92 E1 T9759 09/06/2021 12:45:22
Test Passenger RyanAir Economy 10:30 Athens-London 200.65 E2 T9946 09/06/2021 12:45:30
Test Passenger Lufthansa Business 12:30 Athens-London 700.50 E3 T8189 09/06/2021 12:45:37
屬性是passengerName
、 Company
、 ticketClass
、 itenerary
departureTime
ticketCost
、 gate
、 ticketId
、 issueDate
,它們使用“\t”作為delimiter
。 文件中的每個輸入都是一個String
。 該文件被加載到Arraylist
中,我嘗試根據票的價格對其進行排序。 我所做的是我將 arraylist 拆分為令牌,以便從每個 arraylist 中得到正確的比較,但它似乎不起作用。 此外,我還嘗試實現我發現的所有Collections.sort()
示例,但仍然沒有任何效果。 對文件進行排序所需的結果,以便我可以在JTextArea
中顯示它。文件的每個字段都是一個字符串,它是Ticket class
的屬性,而 ArrayList 的類型是票證( ArrayList<Ticket> = new ArrayList();
)。 這是我到目前為止所擁有的。
private void loadFromFile(String fileName) {
ArrayList<Ticket> ticketsList = new ArrayList();
try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
String line = "";
String[] tokens;
Ticket ticket = new Ticket();
float totalTicketCost = (float) 0.00;
int numberOfLines = 0;
while(reader.ready()){
line = reader.readLine();
tokens = line.split("\t");
if (tokens.length == 9) {
ticket = new Ticket(tokens[0], tokens[1], tokens[2], tokens[3], tokens[4], tokens[5],tokens[6], tokens[7], tokens[8]);
ticketsList.add(ticket);
}
area.append(ticket.toString());
totalTicketCost += Float.parseFloat(tokens[5]);
// format dacimals for total cost
DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(2);
numberOfTickets.setText(String.valueOf(numberOfLines));
totalCost.setText(String.valueOf(df.format(totalTicketCost)));
numberOfLines++; //Total number of tickets
}
// Since nothing works let's try the C way of finding the the biggest ticketCost
float tmp = Float.valueOf(ticketsList.get(0).getTicketPrice());
float max = Float.valueOf(ticketsList.get(0).getTicketPrice());
for( int i = 0; i < ticketsList.size(); i++){
tmp = Float.valueOf(ticketsList.get(i).getTicketPrice());
if( max < tmp ){
max = tmp;
// currentBig = Float.valueOf(ticketsList.get(i+1).getTicketPrice());
}
System.out.println(tmp + "\n");
}
} catch (Exception e) {
}
}
您可以使用 sort 方法( https://docs.oracle.com/javase/8/docs/api/java/util/List.html#sort-java.util.Comparator- )對列表中的對象進行排序。 To compare them you can use the 'Comparator' class ( https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html ):
// add tickets to list (as received from file)
List<Ticket> dummies = getTickets();
dummies.sort(Comparator.comparing(Ticket::getName));
// you now have a sorted list that can be printed/displayed
for(Ticket t : dummies)
printTicket(t);
您只需要一個獲取器來獲取您希望對列表進行排序的相應標記(即成員變量)。 要按價格排序,只需使用dummies.sort(Comparator.comparing(Ticket::getPrice));
(例如,假設價格是一個整數)。 Output(按名稱排序):
0 A-ticket Economy
2 B-ticket Economy
4 C-ticket Business
3 C-ticket Business
1 D-ticket Business
第一個數字表示將票添加到列表中的順序(例如,首先添加 A 票,然后添加 D 票)。 請注意,您還可以通過添加.thenComparing(Ticket::getId)
使用此方法按多個標記排序,因此如果兩個票具有相同的名稱,它們可以按 id 排序。 添加此排序行變為:
dummies.sort(
Comparator.comparing(Ticket::getName)
.thenComparing(Ticket::getId)
);
和 output:
0 A-ticket Economy
2 B-ticket Economy
3 C-ticket Business
4 C-ticket Business
1 D-ticket Business
(注意兩張 C 票如何改變順序)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.