簡體   English   中英

如何根據特定令牌使用 Arraylist 對文件進行排序?

[英]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

屬性是passengerNameCompanyticketClassitenerary departureTime ticketCostgateticketIdissueDate ,它們使用“\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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM