我正在开发一个打开数据文件的程序,并使用while循环逐行读取文件,以便将数据存储在二叉搜索树中。我唯一的问题是我不知道如何处理循环条件,因为文件的最后一行没有新的行字符。我通常使用带扫描程序的hasNextLine()来读取文件,但这会在程序中引发错误,我不能使用hasNext(),因为我需要抓住整行而不仅仅是它的一部分。什么是最好的方法呢?
public static BinaryTree getInventory(BinaryTree tree, Scanner input) {
String line, title = "";
int available = -1, rented = -1, comma = 0;
boolean quote = true;
// While not the end of file
while (input.hasNextLine()) {
line = input.nextLine();
for (int i = 1; i < line.length(); i++) {
if (line.charAt(i) == '"') {
title = line.substring(1, i);
comma = i + 1;
quote = false;
i++;
}
else if (line.charAt(i) == ',' && !quote) {
available = Integer.parseInt(line.substring(comma + 1, i - 1));
comma = i;
i++;
}
else if (i + 1 == line.length()) {
rented = Integer.parseInt(line.substring(comma + 1, i));
}
}
tree.insert(new Node(title,available,rented));
}
return tree;
}
答案 0 :(得分:1)
您可以通过捕获hasNext()
来避免NoSuchElementException
的需要。同时给出了文件的结构(似乎是"title",XX,YY
),你可以避免使用像这样的代码循环使用行字符
try {
while (true) {
String line = input.nextLine();
int rdquo = line.indexOf('"', 1);
String title = line.substring(1, rdquo);
String[] avail = line.substring(rdquo+2).split(",");
tree.insert(new Node(title, Integer.parseInt(avail[0]) , Integer.parseInt(avail[1]));
}
} catch (NoSuchElementException reachedEndOfFile) { }
答案 1 :(得分:0)
接受的答案应该可以很好地解决您的问题,但我认为值得指出一些问题,以便您(或从您的帖子中学习的人)正确理解Scanner的工作原理。
给定像Line 1\nLine 2
这样的输入源,其中第2行不以换行符结尾,以下代码将打印两行而不会产生任何错误。
while (input.hasNextLine()) {
System.out.println(input.nextLine());
}
这也会打印两行。
while (input.hasNext()) {
System.out.println(input.nextLine());
}
鉴于你的示例代码,我认为你的一个标题很可能包含一个逗号,这会导致Integer.parseInt尝试解析一些不是整数的文本。在寻求帮助以排除引发错误的代码时,分享异常和可能的堆栈跟踪很有帮助。