#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
}