3 回答
TA贡献1824条经验 获得超5个赞
让我们分解一下:
这将读取输入文件的每一行,计算每一行,然后丢弃它们:
while(reader.hasNextLine()) { reader.nextLine(); lineCount++; }
您现在位于文件末尾。
分配一个足够大的字符串数组。
String[] bookArray = new String[lineCount];
尝试阅读更多行。循环将立即终止,因为
reader.hasNextLine()
将返回false
。您已经在文件末尾。所以你分配给的语句
bookArray[i]
不会被执行。while (reader.hasNextLine()) { for (int i = 0; i < lineCount; i++) { bookArray[i] = reader.next(); } }
由于
bookArray[i] = ...
上面从未执行过,所有数组元素仍将是null
.for (int k = 0; k < lineCount; k++) { System.out.println(bookArray[k]); }
一种解决方案是打开并读取文件两次。
另一种解决方案是将文件“重置”回开头。(有点复杂。)
另一种解决方案是使用 aList
而不是数组,这样您就不需要读取文件两次。
另一种解决方案是在 javadoc 中搜索一种方法,该方法会将文件/流的所有行读取为字符串数组。
(其中一些可能会因您的练习要求而 被排除。您将其解决...)
第3步的嵌套循环也是错误的。您不需要在 while 循环中使用 for 循环。您需要一个循环来“遍历”行并递增数组索引 ( i
)。它们不需要都由循环语句本身来完成。您可以在循环体中执行一个或另一个(或两个)。
TA贡献1890条经验 获得超9个赞
您试图在文件中循环两次,但您已经在第一次到达文件末尾。不要循环两次。将两个 while 循环“合并”为一个,删除 while 循环内的 for 循环并收集所有书名。然后您可以使用列表的大小稍后打印它们。我的 Java 可能生锈了,但它在这里 -
import java.io.*;
import java.util.*;
public class LibraryInputandOutputs {
public static void main(String args[]) throws IOException {
// int lineCount = 0; - You don't need this.
File inputFile = new File("bookTitles.inp.txt");
Scanner reader = new Scanner(inputFile);
// Use an array list to collect book titles.
List<String> bookArray = new ArrayList<>();
// Loop through the file and add titles to the array list.
while(reader.hasNextLine()) {
bookArray.add(reader.nextLine());
// lineCount++; - not needed
}
// Not needed -
// while (reader.hasNextLine()) {
// for (int i = 0; i < lineCount; i++) {
// bookArray[i] = reader.next();
// }
// }
// Use the size method of the array list class to get the length of the list
// and use it for looping.
for (int k = 0; k < bookArray.size(); k++) {
System.out.println(bookArray[k]);
}
reader.close();
inputFile.close();
}
}
TA贡献1776条经验 获得超12个赞
特别是,使用 List 通常比使用数组更好,因为它更灵活。如果你需要一个数组,你总是可以在 List 被填充后使用 toArray() 。
你的书名是分开的吗?如果是这样,您可能不需要 Scanner 类,可以使用 BufferedReader 或 LineNumberReader 之类的东西。
添加回答
举报