2

特定の問題に取り組んでいますが、これは技術的には宿題であり、何が間違っているのかを知りたいので、より一般的な解決策が欲しいです。いくつかの注意点: スキャナー クラスを使用する必要があり、データが配列などに含まれていません。サイトを読んで、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 で、その後に 3 つのグレードが続きます。各クラスはゼロ行で終了し、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
}
}

さて、このようなコードを実行すると、必要な出力を出力することができますが、データの 1 行おきにスキップされます。inputFile.nextLine(); を削除します。2 番目の学生 ID をスキップし、他のすべての出力を台無しにします。だから私が知りたいのは、私が間違っていることだと思います.次の学生IDを食べずに、次の整数がゼロになることをどのようにチェックすればよいですか?

4

2 に答える 2

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 の方法を使用してレコードを取得した方が、はるかに簡単でわかりやすいです。

PSこれはStackOverflowでの私の最初の答えです。それが役立つことを願っています。

于 2013-10-21T08:36:28.953 に答える
0

すべての行を文字列変数に格納し、その行から整数を解析してから、行自体からではなく、その文字列から読み取って割り当てます。そう:

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 に対して null チェックを行う必要があります。

于 2013-10-21T06:05:26.993 に答える