有一个任务从文件中逐行读取姓名和年龄,实现一个静态方法来创建该类的对象Human
并将其写入List<Human>
.
我已经实现了一个单独的年龄和名字的“集合”,但我不知道如何动态地实现新对象的初始化。我对newInstanse()
我找到的文档中的方法一无所知。
List<Human> people = new ArrayList<>();
List<Integer> numbers = new ArrayList<>();
List<String> names = new ArrayList<>();
try (Scanner sc = new Scanner(file)) {
while (sc.hasNextLine()) {
String[] nums = sc.nextLine().replaceAll("[^\\d-]+", " ").split(" ");
for (String n : nums) {
if (!n.isEmpty()) {
numbers.add(Integer.valueOf(n));
}
}
}
while (sc.hasNextLine()) {
String[] name = sc.nextLine().replaceAll("[^A-Za-zА-Яа-я]", "").split(" ");
for (String nm : name) {
if (!nm.isEmpty()) {
names.add(nm);
}
}
}
if (!isPos(numbers)) {
try {
throw new IOException();
}
catch (IOException e){
System.out.println("Некорректный входной файл");
}
}
else {
for (int i = 0; i < names.size(); i++) {
people.add(new Human(names.get(i), numbers.get(i)));
}
}
}
catch (FileNotFoundException e) {
System.out.println("Файл не найден.");
}
System.out.println(people);
请不要留下注释try/catch
,它们是根据任务条件需要的!
输出列表时,people
会得到空括号 []。怎么了?
文件中的列表示例
Амир 18
Тагир 18
Хамид 18
Усман 26
Нурадил 17
所提供代码的主要问题是它无法用名称填充列表,因为循环中第一遍的扫描器
while (sc.hasNextLine())
仅处理数字数据(年龄),因此第二个循环将不会执行。如果主要目标是返回填充的列表
Human
,则分别创建和填充两个列表似乎numbers
有些过分了names
。由于文件中的每个非空行都代表某种整体数据实体,因此只需实现读取该行的名称和年龄,并在检测到错误数据时中断读取即可。
这也将减少慢速 I/O 操作(文件读取)的数量。
处理每一行的逻辑可以移动到一个单独的方法中
parseHuman
,例如,如果允许给定文件中的姓名和年龄字段位于该行中的不同位置:该方法实现了以下功能:
Human
。在这里,常规引擎
"\\p{L}+"
将检查名称是否是任何字母的非空序列,并且相应地"\\d{1,3}"
,年龄包含不超过三位数字的非空序列(没有符号!)。因此,读取文件的代码逻辑将简化为为每一行调用指定的方法: