簡體   English   中英

來自文本文件的Java排序行

[英]Java sort lines from text file

我需要從文本文件中讀取播放器,然后根據用戶的選擇輸出排名前3、5或10的播放器。 文本文件中的數據格式為:

  • 名稱,日期,正確答案,分數
  • 約翰,21.8.2016,4/5,80
  • 埃迪,21.8.2016,5/5,100

我需要按點對它們進行排序,然后按照我已經寫好的輸出3,5或10個最佳球員。

這是我到目前為止所做的:

public static void topPlayers(){

    File f=new File("results.txt");
    Scanner scf=new Scanner(f);
    Scanner sc=new Scanner(System.in);

    Scanner sc2=new Scanner(f);

    while(sc2.hasNextLine()){
      String p1=scf.nextLine();
      String[] niz=p1.split(", ");
    }
    sc2.close();

    System.out.println("Choose an option: ");
    System.out.println("1. Top 3 players"); 
    System.out.println("2. Top 5 players");
    System.out.println("3. Top 10 players");
    int op=sc.nextInt();

    if(op==1){
       System.out.println("Top 3 players: ");
       for(int i=0; i<3; i++){
         //System.out.println(....);
       }
    }
    else if(op==2){
      System.out.println("Top 5 players: ");
      for(int i=0; i<5; i++){
         //System.out.println(....);
       }
    }
    else if(op==3){
      System.out.println("Top 10 players: ");
      for(int i=0; i<10; i++){
         //System.out.println(....);
       }
    }
    else{
       System.out.println("Wrong option!");
    }
  }

如何按玩家點對文本文件中的這些行進行排序?

使用數組niz重新創建播放器類的實例。

(是的,如果還沒有,您將需要創建一個播放器類)

然后從每一行創建一個播放器,並將其添加到java.util.list

療法與給定的標准...... correctAnswerstotalPoints對它們進行排序

滿足您的需求。

例:

 List<Player> myPlayers = new ArrayList<>();
 while(sc2.hasNextLine()){
      String p1=scf.nextLine();
      String[] niz=p1.split(", ");
      myPlayers.add(new Player(niz));
    }


Collections.sort(myPlayers, new Comparator<Player>() {
    @Override
    public int compare(Player o1, Player o2) {

    return Integer.compare(o1.getTotalPoints(), o2.getTotalPoints());
    }
});

之后,子列表可以為您提供所需的球員

myPlayers.subList(0, 2);

將給第1名3名玩家...

其中foo是實例或匿名比較器實現者...

我強烈建議您使用BufferedReader而不是使用三台掃描儀。 此代碼段將使您無窮頭痛:

File f=new File("results.txt");
Scanner scf=new Scanner(f);
Scanner sc=new Scanner(System.in);

Scanner sc2=new Scanner(f);

相反,請使用類似以下內容的內容:

File f = new File("results.txt");
FileReader fileIn = new FileReader(f);
BufferedReader reader = new BufferedReader(fileIn);

使用這種方法,您可以使用", ""\\n"作為分隔符或其他所需內容逐行或逐段讀取。

舊的優質Stream API怎么樣?

自定義sortingKeyIndex, separator, neededLines以適應特殊需要。

import java.nio.file.*;
import java.util.Comparator;
import java.util.stream.Stream;

public class FileSortWithStreams {

    public static void main(String[] args) throws Exception {
        Path initialFile = Paths.get("files/initial.txt");
        Path sortedFile = Paths.get("files/sorted.txt");

        int sortingKeyIndex = 3;
        String separator = ", ";
        int neededLines = 5;


        Comparator<String[]> reversedPointsComparator =
                Comparator
                        .<String[], Integer>comparing(s -> extractAsInt(s, sortingKeyIndex))
                        .reversed();

        Stream<CharSequence> sortedLines =
                Files.lines(initialFile)
                     .map(s -> s.split(separator))
                     .sorted(reversedPointsComparator)
                     .limit(neededLines)
                     .map(s -> String.join(separator, s));

        Files.write(sortedFile, sortedLines::iterator, StandardOpenOption.CREATE);
    }

    static int extractAsInt(String[] items, int index) {
        return Integer.parseInt(items[index]);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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