Предположим, у меня есть такой файл:

Name: someone1 surname
Age: someNumber1
Height: whoCares1
Weight: someWeight1

Name: someone2
Age: someNumber2
Height: whoCares2
Weight: someWeight2

Name: someone3
Age: someNumber3
Height: whoCares3
Weight: someWeight3

И я хочу получить все строки рядом с "Name:" в ArrayList<String>.

Я хочу использовать для этого только класс Scanner.

Я пробовал получить часть «Имя:» из файла, используя такой код:

while(scanner.hasNextLine()) {
            //read line by line
            String line = scanner.nextLine();

            //code to search for a word in the file which 
                if(line.indexOf("Name:")!=-1) {
                    // will search line by line for this word ignoring numbers in addition
                    // I find the word with this, what next?
                // I want to get word next to Name: and not only from one but from all the instances of the word Name:
                }
                else
                    System.out.println("does not");


        }

Я хочу получить слово рядом с «Имя:» и не только из одного, но и из всех экземпляров слова «Имя:».

Как я могу это сделать?

< Сильный > Edit:

Кроме того, как разделить строки внутри файла, например, если я хочу сохранить Имя первого лица в файле как someone1 в одном ArrayList и surname в другом ArrayList. Как мне разделить их и сохранить в новых списках массивов.

0
user10516751 23 Окт 2018 в 10:40

2 ответа

Лучший ответ

Вы можете попробовать использовать String#matches для определения интересующих строк:

List<String> names = new ArrayList<>();

while (scanner.hasNextLine()) {
    String line = scanner.nextLine();
    if (line.matches("^Name:.*")) {
        names.add(line.replaceAll("^Name:\\s+", ""));
    }
}

Идея здесь состоит в том, чтобы захватить все строки, начинающиеся с Name:, а затем удалить префикс Name:, оставив после себя желаемый контент.

Объяснение используемого регулярного выражения:

^      from start of string (line)
Name:  match text 'Name:'
\\s+   followed by any number of spaces (or other whitespace)

Итак, удалив ^Name:\\s+, мы должны остаться с только информацией об имени слева от него.

< Сильный > Edit:

Если, например, ваше имя содержало на самом деле имя и фамилию, то каждая строка выглядела бы примерно так:

Name: George Washington

В этом случае, если формат будет исправлен, мы могли бы попытаться использовать String#split для выделения имени и фамилии:

String[] parts = line.split("\\s+");
String first = parts[1];
String last = parts[2];
// then store first and last in separate lists

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

1
Tim Biegeleisen 23 Окт 2018 в 08:15

Ниже приводится функциональный подход к извлечению списка имен из предоставленного файла:

public List<String> getNames(File file) throws IOException {
    return Files.lines(file.toPath())
            .filter(str -> str.contains("Name: "))
            .map(str -> str.split("Name: ")[1])
            .collect(Collectors.toList());
}
0
Boris van Katwijk 23 Окт 2018 в 08:37
52943636