Как отсортировать записи, хранящиеся в текстовом файле, по значению в каждой строке - PullRequest
0 голосов
/ 25 мая 2018

У меня есть текстовый файл с некоторыми данными, числами и оценкой, и мне нужно отсортировать эти данные по высокой оценке (10,9,8,7,6 ...)

Как мне это сделать?это?

Может быть, прочитав и создав 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
    }
}

здесь у меня есть текст, который мне нужно отсортировать

Я попытался сделать это с помощью сканера, но он не работает

1 Ответ

0 голосов
/ 25 мая 2018

Непонятно, каким должен быть вывод, но по существу у вас есть следующие шаги:

  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());

Если вам нужны имена и остальные детали, вам нужно создать конкретный объект, который несет данные (имя, время и т. Д.).), и вместо того, чтобы извлекать только счет, вы заполняете объект.Сортировка будет происходить на счету свойстваИз вашего вопроса не ясно, если это то, что вам нужно.

ОБНОВЛЕНИЕ: Из комментариев кажется, что все данные действительно требуются.

Чтобы сохранить всеДанные, которые вы должны сначала создать объект, который представляет одну строку в вашем файле.К сожалению, ваша строка на самом деле не всегда отформатирована, было бы проще, если бы значения были разделены следующим образом:

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());

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...