Чтение текстового файла построчно и сохранение имен в список в java

#java #arraylist #file.readalllines

#java #список массивов #файл.строки чтения

Вопрос:

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

Откуда я могу получить полные имена readData() ?

То, что я ищу, — это этот вывод ["Alice Smith", "Bob Brown", "Carol White", "David Doe"] , а не дублированные имена.

Пока мой код выглядит примерно так:

 public class GradeRepository {

    public GradeRepository(){
        readData();
    }
    public void readData() {

        for (String line : readLines()) {

            String[] parts = line.split("\|");

            String firstName = parts[0];
            String lastName = parts[1];
            String subject = parts[2];
            String grade = parts[3];

            System.out.println(firstName);
            System.out.println(lastName);
            System.out.println(subject);
            System.out.println(grade);
            System.out.println(Arrays.toString(parts));
        }

    }

    public List<String> getFullNames() {
        List<String> fullNames = new ArrayList<>();

        return fullNames;
    }

    private List<String> readLines() {
        try {
            return Files.readAllLines(Paths.get("src/ex1/grades.txt"));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
 

Данный текстовый файл:
grades.txt

 Alice|Smith|math|5
Bob|Brown|english|4
David|Doe|math|3
Bob|Brown|math|4
Bob|Brown|chemistry|5
Alice|Smith|english|4
Carol|White|chemistry|3
David|Doe|chemistry|4
 

Комментарии:

1. Лучшая идея — создать объект, возможно, Person с полем, таким как FirstName, LastName и т. Д. В любом случае, если ваша цель — вернуть FirstName LastName, вы можете вернуть Set<String>, который будет содержать эту информацию

2. Создайте Set<String> . Поместите каждое имя в набор.

Ответ №1:

readData необходимо изменить либо для возврата списка , в String[] котором каждый строковый массив представляет строку , либо List<String[]> data для создания GradeRepository и заполнения поля readData .

Далее, чтобы избавиться от повторяющихся имен Set<String> , следует использовать a, как предложено в комментариях, а LinkedHashSet реализация позволяет сохранить порядок вставки.

Пример реализации, в которой readData возвращается список:

 public List<String[]> readData() {
    List<String[]> data = new ArrayList<>();
    for (String line : readLines()) {
        String[] parts = line.split("\|");
        // ... print parts as above if necessary...
        data.add(parts);
    }
    return data;    
}

public Set<String> getFullNames() {
    Set<String> fullNames = new LinkedHashSet<>();

    for (String[] row : readData()) {
        fullNames.add(row[0]   " "   row[1]);
    }

    return fullNames;
}
 

Возможно, предпочтительнее использовать Stream API, чтобы избежать создания промежуточных коллекций, поэтому все эти методы могут быть переписаны в один:

 public Set<String> getFullNames() throws Exception {
    return Files.lines(Path.of("dataset.txt")) // Stream<String>
        .map(line -> line.split("\|")) // Stream<String[]>
        .filter(arr -> arr.length > 1) // ensure there are 2 columns at least
        .map(arr -> arr[0]   " "   arr[1]) // Stream<String>
        .collect(Collectors.toCollection(LinkedHashSet::new)); // get collection of unique names
}