Как отсортировать строки в файле, начиная с n-го символа? - PullRequest
1 голос
/ 03 апреля 2019

У меня есть файл следующим образом: 1 ананас \ n 2 яблока \ n

Я бы хотел отсортировать его, начиная с n-го символа в каждой строке, где будет указано n.

Например, если n = 2, файл должен быть отсортирован как 2 apple \ n 1 ананас \ n, так как 'a' находится перед 'p'

Если n = 4, то отсортированный файл должен быть 1 ананасом \ n 2 яблока \ n, так как 'i' перед 'p'

Как мне этого добиться?

Сортировка по 1-му (0-му) символу работает отлично. Я перехожу по этой ссылке: https://javaconceptoftheday.com/how-to-sort-a-text-file-in-java/

Реализован следующий код:

String inputFile = 'test.txt';
String outputFile = 'output.txt';

FileReader fileReader = new FileReader(inputFile);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String inputLine;
List<String> lineList = new ArrayList<String>();
while ((inputLine = bufferedReader.readLine()) != null) {
    lineList.add(inputLine);
}
fileReader.close();

Collections.sort(lineList);

FileWriter fileWriter = new FileWriter(outputFile);
PrintWriter out = new PrintWriter(fileWriter);
for (String outputLine : lineList) {
    out.println(outputLine);
}
out.flush();
out.close();
fileWriter.close();

Приведенный выше код работает правильно, однако сортировка, начинающаяся с n-го символа в каждой строке, не реализована.

Ответы [ 3 ]

4 голосов
/ 03 апреля 2019

Вы можете использовать собственный компаратор, который берет подстроку каждой строки:

Files.lines(Paths.get(inputFile))
     .sorted(Comparator.comparing(s -> s.substring(n))
     .forEach(System.out::println);
2 голосов
/ 03 апреля 2019

Вы можете использовать класс Files и сортировать строки в потоке.Наконец, вы можете снова сохранить результат, используя класс Files:

try (Stream<String> lines = Files.lines(Paths.get("test.txt"))) {
    List<String> sortedLines = lines
            .sorted(Comparator.comparing(line -> line.substring(n)))
            .collect(Collectors.toList());
    Files.write(Paths.get("output.txt"), sortedLines);
} catch (IOException e) {
    e.printStackTrace();
}

В качестве альтернативы вы можете использовать line.charAt(n) вместо line.substring(n), если хотите отсортировать только по одному символу.

1 голос
/ 03 апреля 2019

Создайте компаратор и используйте подстроку, чтобы создать подстроку, начинающуюся с n-й позиции, а затем сравните на основе этого.

https://www.geeksforgeeks.org/comparator-interface-java/

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