Непонятно, каким должен быть вывод, но по существу у вас есть следующие шаги:
Прочитайте файл построчно.Вы можете использовать BufferedReader
для этого или более современный подход к Java 8, получив Stream
из Strings
, каждая строка представляет строку.
Stream<String> lines = Files.lines(Paths.get(fileName));
Переведите каждую строку в информацию, которую вы хотите сохранить.Вы хотите имя?Вы хотите счет?Вы хотите всю информацию (время, сетка и т. Д.).Если вам просто нужен счет, вы можете найти индекс строки 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());