Java - читать файл построчно до конца файла

Я работаю над проектом, который требует от меня найти минимальное связующее дерево для данного графа в Java. Я настоящий новичок в Java, так как в основном использую C++.

Я написал алгоритм, но есть уникальный тип входного формата, который выглядит примерно так:

0 1:33 2:0 3:12 4:29 5:32 6:22 7:13 8:45 9:21
1 0:6 2:18 3:2 4:26 5:41 6:8 7:47 8:13 9:19
2 0:22 1:28 3:49 4:47 5:5 6:16 7:32 8:5 9:34
3 0:21 1:24 2:2 4:29 5:20 6:39 7:17 8:21 9:3
4 0:27 1:20 2:38 3:4 5:14 6:25 7:0 8:24 9:11
5 0:20 1:7 2:29 3:15 4:3 6:19 7:11 8:19 9:41
6 0:14 1:36 2:6 3:45 4:18 5:33 7:43 8:22 9:36
7 0:25 1:12 2:15 3:45 4:18 5:43 6:41 8:37 9:26
8 0:29 1:44 2:23 3:15 4:34 5:45 6:27 7:29 9:4
9 0:18 1:41 2:20 3:25 4:18 5:10 6:10 7:49 8:42

или, точнее:

[source-vertex] [destination-vertex]:[weight] [destination-vertex]:[weight] ...

Что я хотел бы знать, так это как я могу прочитать такой формат ввода?

Я думал читать каждую строку до конца файла, а затем анализировать числа из каждой строки.

что ты уже испробовал?

Turamarth 07.09.2018 11:41

Итак, есть ли проблемы с кодом, который вы пробовали до сих пор (который читает файл, а затем анализирует его)?

Shark 07.09.2018 11:42

Начиная с Java 8, вы можете использовать Files.readAllLines (попробуйте и вернитесь к нам, если вы столкнулись с какой-либо проблемой)

Thoomas 07.09.2018 11:43

Да, вы должны делать это так, как вы думаете, давайте покажем, что вы уже сделали.

jack jay 07.09.2018 11:43

@Shark Я этого еще не пробовал, потому что не знаком с синтаксисом. Я ищу разные источники, чтобы узнать, как я могу это сделать сейчас.

hiimsoba 07.09.2018 11:43

@Thoomas Я попробую, спасибо!

hiimsoba 07.09.2018 11:44

Расширьте абстрактный класс Reader, используя BufferedReader в качестве модели. Включите символы разделителя строк.

Prakhar Nigam 07.09.2018 11:45

@Thoomas Это работает, спасибо, но у меня есть еще вопрос. Поскольку входной файл может быть довольно большим, есть ли способ читать по одной строке за раз и не сохранять целые строки в списке?

hiimsoba 07.09.2018 11:57

@hiimsoba Вы можете использовать BufferedReader: docs.oracle.com/javase/7/docs/api/java/nio/file/…

Thoomas 07.09.2018 12:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
9
262
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я бы предложил использовать Steam API и загрузить ваш файл с помощью BufferedReader и спеть метод lines (). Это приводит к потоку, которым вы можете манипулировать по своему усмотрению.

Ответ принят как подходящий

Итак, у вас в основном есть два вопроса:

  • как читать файл построчно: есть много способов сделать это (некоторые удобные API в Java8 +), классический способ - получить Reader и прочитать с InputStream с соответствующим текстом кодирование, используя попробовать с ресурсами.
  • как читать структурированные данные: самый простой способ - использовать регулярные выражения для извлечения данных.

Код для чтения данных в соответствии с вашим форматом:

File f = ... // file to read

try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8))) {

    // regular expression checking the format of each line
    Pattern linePattern = Pattern.compile("(\\d+)(?:\\s+(\\d+):(\\d+))*");
    // regular expression to find the index (first number) in a line
    Pattern indexPattern = Pattern.compile("(\\d+)");
    // regular expression to find the vertices (a:b) in a line
    Pattern relationPattern = Pattern.compile("(\\d+):(\\d+)");

    String line;
    while ((line = reader.readLine()) != null) {

        if (linePattern.matcher(line).matches()) {

            Matcher indexMatcher = indexPattern.matcher(line);
            if (indexMatcher.find()) {
                int sourceVertex = Integer.parseInt(indexMatcher.group(1));
                // do something with the sourceVertex 

                Matcher relationMatcher = relationPattern.matcher(line);
                while (relationMatcher.find()) {
                    int destinationVertex = Integer.parseInt(relationMatcher.group(1));
                    int weight = Integer.parseInt(relationMatcher.group(2));
                    // do something with destinationVertex and weight
                }
            }
        }
    }
}

Другие вопросы по теме