我正在努力解决一个具体的问题,但是看到这是技术上的功课,我想知道我做错了什么,我希望得到一个更通用的解决方案。一些警告:我必须使用扫描仪类,我的数据不在数组或任何东西。我知道从网站上阅读BufferedReading是首选。从我读过的内容来看,我想我也更喜欢它。但这不是我允许在这里工作的。
我正在尝试从数据文件中读取,然后对该文件执行一些操作。数据如下:
1234 55 64 75
1235 44 32 12
...
nnnn xx yy zz
0
2234 47 57 67
2235 67 67 67
...
nnnn xx yy zz
0
每行是一个ID,后跟三个等级。每个类都以零行终止,然后while循环从顶部开始:
while (classContinues == true) {
//get the student's data and assign it in the program
studentID = inputFile.nextInt();
programGrade = inputFile.nextInt();
midtermGrade = inputFile.nextInt();
finalGrade = inputFile.nextInt();
// in here I'm doing other stuff but I don't need help with that
// check if the class has more students
if (inputFile.nextInt() == 0) {
classContinues = false;
} else {
classContinues = true;
inputFile.nextLine(); // eat the rest of the line
}
}
现在,当您运行这样的代码时,它会设法打印我想要的输出,但它会跳过每隔一行数据。删除inputFile.nextLine();它会跳过第二个学生ID然后混淆所有其他输出。所以我想我想知道的是我做错了什么 - 如何在不吃下一个学生证的情况下检查下一个整数为零?
答案 0 :(得分:1)
当来自输入的第一个'0'时,下面的代码将跳出while循环。这就是为什么它无法捕获所有记录。
if (inputFile.nextInt() == 0) {
classContinues = false;
} else {
classContinues = true;
inputFile.nextLine(); // eat the rest of the line
}
对于nextInt()方法,当它被调用时,它将返回当前的int值并指向下一个。
尝试下面的代码,它可以获得成绩记录的每一行。我创建了一个名为StudentGrade的实体来存储记录。 For each循环将打印出列表中存储的记录。
while (classContinues == true) {
StudentGrade stu = new StudentGrade();
// get the student's data and assign it in the program
int id = 0;
if ((id = inputFile.nextInt()) != 0) {
stu.studentID = id;
stu.programGrade = inputFile.nextInt();
stu.midtermGrade = inputFile.nextInt();
stu.finalGrade = inputFile.nextInt();
studentGrades.add(stu);
// in here I'm doing other stuff but I don't need help with that
// check if the class has more students
}
else if (!inputFile.hasNext()) {
classContinues = false;
}
}
for (StudentGrade s : studentGrades) {
System.out.println(s);
}
输入数据:
1234 55 64 75
1235 44 32 12
1236 23 32 32
0
2234 47 57 67
2235 67 67 67
2236 23 23 2
0
输出:
1234 55 64 75
1235 44 32 12
1236 23 32 32
2234 47 57 67
2235 67 67 67
2236 23 23 2
顺便说一下,最好使用Mehmet的方法来获取记录,这样更容易理解。
P.S。这是我在StackOverflow中的第一个答案。希望它可以提供帮助。
答案 1 :(得分:0)
将每一行存储到一个String变量中,从该行解析整数,然后通过从该字符串中读取它们来分配它们,而不是从行本身中读取它们。所以:
String nextLine;
while (classContinues)
{
nextLine = inputFile.nextLine();
String[] tokens = nextLine.split(" ");
if(tokens.length == 1) //this means line has '0' character
classContinues = false;
else
{
classContinues = true;
studentID = tokens[0];
programGrade = tokens[1];
midtermGrade = tokens[2];
finalGrade = tokens[3];
// your stuff
}
}
如果会出现任何类型的错误,会在此代码中显示误导性结果,那可能是我的错误,因为我不知道项目的其余部分。所以我发布了一个类似于你的代码。
此外,您必须对从nextLine方法获得的String进行空检查。