如何在不吃下一个整数的情况下检查下一行?

时间:2013-10-21 05:21:24

标签: java while-loop java.util.scanner

我正在努力解决一个具体的问题,但是看到这是技术上的功课,我想知道我做错了什么,我希望得到一个更通用的解决方案。一些警告:我必须使用扫描仪类,我的数据不在数组或任何东西。我知道从网站上阅读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然后混淆所有其他输出。所以我想我想知道的是我做错了什么 - 如何在不吃下一个学生证的情况下检查下一个整数为零?

2 个答案:

答案 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进行空检查。