public static void parseFileToStringList(File file){
List<String> people = new ArrayList<>();
List<Integer> numbers = new ArrayList<>();
try {
Scanner sc = new Scanner(file);
String line;
while (sc.hasNextLine()) {
line = sc.nextLine().replaceAll("\\D+", "");
String[] lines = line.split(" ");//проблема возникает здесь
}
for (String ln : lines) {
numbers.add(Integer.parseInt(ln));//и здесь
}
// ниже можно не смотреть
for (int i = 0; i < numbers.size(); i++) {
if (numbers.get(i) < 0) {
try {
throw new IOException();
} catch (IOException e) {
System.out.println("Некорректный входной файл.");
}
} else {
while (sc.hasNextLine()) {
String line2 = sc.nextLine();
people.add(line2);
}
}
}
}
catch (FileNotFoundException e) {
System.out.println("Файл не найден.");;
}
for (int i = 0; i < people.size(); i++) {
System.out.println(people.get(i));
}
我知道我无法访问该数组,lines
因为它是在循环内初始化的,但是无法通过创建第二个临时数组然后从一个数组传输到另一个数组来解决此问题。因为循环for
位于 中while
,所以第一个数组无法用临时数组完全填充主数组,直到临时数组被填满为止,这发生在循环之外for
。
第二个地方出现了一个错误,即无法将“空”数组单元解析为动态单元。
我怎样才能以不同的方式做到这一点?
所提供的代码存在以下问题:
lines
变量的第一个循环之外使用局部变量而导致的“预测”编译错误。 为了消除这个错误,可以在循环之前声明这个变量并对其进行初始化,但这并不能解决代码逻辑的主要问题。while
while
处理数字时的“奇怪”逻辑:如果将读取行中的所有非数字字符替换为空字符串(replaceAll("\\D+", "")
),那么结果将不会留下一个空格或减号,即:最好的情况是只有一个无符号整数,最坏的情况是空字符串。因此,后续调用
lines = line.split(" ")
意味着作为第一个循环的结果,while
仅保留最后一行的数组。如果输入文件包含许多行,每行都包含许多应写入某个列表的整数,则可以按如下方式完成。
或者使用流且不使用扫描器的此选项,所提供的代码中未使用其有用的功能:
PS 注释下的代码
// ниже можно не смотреть
也不符合逻辑:line2
,因为此时源文件中的所有行都将被读取。