Как мне получить доступ к каждому слову в файле Java? - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь сохранить каждое слово в этом файле в массиве, чтобы применить к нему свою собственную языковую реализацию. Я уже применил разделение, но когда я поместил строку в переменные части, parts[0] отобразит весь файл вместо одного слова, а parts[1] выдаст ошибку

java.lang.ArrayIndexOutOfBoundsException: 2

Как мне получить доступ к каждому слову в этом файле?

String[] parts = line.split("\\s+");
System.out.print(parts[0] + '\n');

файл test.snol содержит

SNOL
INTO num IS 5
INTO res IS MULT num num
INTO res IS MULT res res
INTO res IS MOD res num
PRINT num
PRINT res
LONS

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Если вы используете Java-8, вы можете сделать это в одной строке: -

String[] words = Files.lines(Paths.get(PATH))
                      .flatMap(line -> Arrays.stream(line.split(" ")))
                      .toArray(String[]::new);

В качестве альтернативы, если вы хотите получить доступ к каждой строке как list из String[], вы можете использовать: -

List<String[]> lines = Files.lines(Paths.get(PATH))
                            .collect(Collectors.toList())
                            .stream().map(e -> e.split(" "))
                            .collect(Collectors.toList());
0 голосов
/ 15 ноября 2018

Маркер совпадения регулярного выражения для пробела: \s. В вашем коде используется обратная косая черта (/) вместо обратной косой черты (\), которая не имеет особого значения, поэтому ваш код пытается сопоставить две прямые косые черты, за которыми следует одна или несколько s s.

В Java регулярные выражения передаются через строки, поэтому обратная косая черта должна быть исключена второй обратной косой чертой (в отличие от прямой косой черты, которая не требует специальной обработки). Ваше регулярное выражение должно читать "\\s+", что будет соответствовать еще одному пробелу.

Ваш вызов split должен затем возвращать массив с каждым словом в строке как отдельным элементом.

Если вы читаете свой файл построчно, вы можете получить доступ к каждому слову с кодом, например

BufferedReader reader = new BufferedReader(new FileReader("D:\\test.snol"));
String line;
while ((line = reader.readLine()) != null) {
    String[] words = line.split("\\s+");
    for (String word : words) {
        System.out.println(word);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...