如何按每行中的值对文本文件中存储的条目进行排序

时间:2018-05-25 14:42:06

标签: java sorting user-interface

我有一个包含一些数据,数字和分数的文本文件,我需要按高分(10,9,8,7,6 ......)对这些数据进行排序

我该怎么做?

也许通过read和create ArrayList?或拆分

我不知道该怎么做

  

我需要按分数(2,2,1,0.8,...)

对此文本进行排序
        saveButton = new JButton(" Save ");
        saveButton.setBackground(Color.white);
        saveButton.setForeground(Color.black);
        saveButton.setFont(normalFont);

        saveButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                PrintWriter writer = null;
                String newLine = System.getProperty("line.separator");
                String textFieldVal = textField.getText();

                double Dsise = size;
                double Dsec = sec;
                double pt = (Dsise * Dsise) / Dsec;
                DecimalFormat df = new DecimalFormat("#.####");
                try {
                    writer = new PrintWriter(new BufferedWriter(new FileWriter("HighScores.txt", true)));
                    writer.println(textFieldVal + " (Time: " + sec + ", grid: " + size + "x" + size + ") " + "Score : " + df.format(pt));
                    writer.close(); 
                } catch (IOException e1) {
                    e1.printStackTrace();
                }

                System.exit(0);

                try {
                    Check();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }


            }

        });





    }

    public void Check() throws IOException {

           // here i need to sort it
    }
}

here i have a text, what i need to sort

我尝试过扫描仪,但它不起作用

1 个答案:

答案 0 :(得分:1)

目前尚不清楚您需要输出的内容,但您基本上有以下步骤:

  1. 逐行读取文件。您可以使用BufferedReader或更现代的Java 8方法,获取Stream Strings,每个字符串代表一行。

    Stream<String> lines = Files.lines(Paths.get(fileName));

  2. 将每个字符串翻译为您要保留的信息。你想要这个名字吗?你想得分吗?你想要所有的信息(时间,网格等)。如果您只需要得分,您可以找到字符串Score :的索引,向其中添加8,并从那里获取字符串的子字符串,这将是您的分数,您可以将其转换为整数。获得数据后,您只需使用集合或流提供的排序机制之一对其进行排序。

    List<Double> scores = lines .map(line -> line.substring(line.indexOf("Score :") + 8)) .map(Double::parseDouble) .sorted(Comparator.reverseOrder()) .collect(Collectors.toList());

  3. 如果您需要名称和其他详细信息,则必须创建一个包含数据(名称,时间等)的特定对象,而不是仅提取填充对象的分数。然后在得分属性上进行排序。从您的问题来看,目前尚不清楚这是否是您所需要的。

    更新:根据评论,似乎实际上需要所有数据。

    要保留所有数据,首先要创建一个代表文件中一行的对象。不幸的是,你的字符串并没有真正一致地格式化,如果值被分隔为:

    ,它会更容易
    Bogdan,2,2x2,2
    Leo,6,2x2,0.6667
    

    因此,如果您可以修改您在问题中粘贴的功能,以此格式输出,那么您就会更容易,因为您只需使用String.split(",")。否则,您必须找到每个数据项的位置,indexOf()substring()并将其解压缩。这是你的练习。

    public class Player {
      private final String name;
      private final int time;
      private final String grid;
      private final double score;
    
      public Player(String name, int time, String grid, double score) {
        this.name = name;
        this.time = time;
        this.grid = grid;
        this.score = score;
      }
    
      public double getScore() {
        return score;
      }    
    
      // todo: put all the getters
    
      public static Player parse(String line) {
        //todo: extract the data items from the string... 
      }
    
      @Override
      public String toString() {
        return String.format("%s (Time: %d Grid: %s) Score: %.4f", name, time, grid, score);
      }
    }
    

    然后您的流处理变得更简单:

    List<Player> scores = lines .map(Player::parse) .sorted(Comparator.comparingDouble(Player::getScore).reversed()) .collect(Collectors.toList());