0

現在、学生の名前とテストの点数を保存するテキスト ファイルがあります。ファイルの形式は、姓、名、およびテストのスコアです。テキスト ファイル内の各値はスペースで区切られています。したがって、ファイルは次のようになります。

Smith John 85
Swan Emma 75

すべてのデータをコンソールに出力するようにコードを実行していますが、すべてのテスト スコアを取得して合計し、平均を見つけてコンソールに出力することはできません。 . 同様に、スコアが平均より 10 低い学生を出力します。

現在、これは情報を読み取ってコンソールに出力するために使用しているコードです。

public class ReadTXT 
{

public static void main(String[] args) 
{

{
    String txtFile = "/Users/Amanda/Desktop/Studentdata.txt";
BufferedReader br = null;
String line = "";
String txtSplitBy = " ";

    try {

    br = new BufferedReader(new FileReader(txtFile));
    while ((line = br.readLine()) != null) {


        String[] LastName= line.split(txtSplitBy);
                    String[] FirstName = line.split(txtSplitBy);
                    String[] TS = line.split(txtSplitBy);

        System.out.println("Last Name: " + LastName[0] 
                             + "\n" +"First Name: " + FirstName[1] + "\n" + 
                            "Test Score: " + TS [2] + "\n") ;

    {
        double average = sum / i;
    }
    }
    } catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (br != null) {
        try {
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

System.out.println("Done");

   }

  }
  }

そして、これは私が平均を見つけるために使用しようとしていたコードです。

 int i =Integer.parseInt ("TS");
double sum = 0.0;
for (int x = 0; x < i; sum += i++);
{
double average = sum / i;
}

ただし、この例外が引き続き発生します。

Exception in thread "main" java.lang.NumberFormatException: For input string: "TS"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:492)
    at java.lang.Integer.parseInt(Integer.java:527)
    at ReadTXT.main(ReadTXT.java:35)

私はJavaを学ぶのは初めてですが、試しています。

4

2 に答える 2

1

おっとっと:

int i =Integer.parseInt ("TS"); 

これは意味がありません。「TS」が表す数字は何?


編集:あなたは次のように述べています:

TS は有効な数値ではないことを知っているため、数値にキャストしようとしていました

文字を数字に「キャスト」することはできません。これも意味がありません。

ファイル内の文字列を読み取ってから、それらの文字列を解析する必要があります。作成した文字ではありません。


あなたのコードがすべきことは次のとおりです。

  • for ループでファイルの各行を読み込む
  • このループ内で、String のsplit(" ")メソッドを使用して String を分割します。
  • Integer.parse(...)返された配列の 3 番目の項目を解析するために使用します。

では、Integer.parse(String [] TS) を使用しますか?

いいえ、String 配列を String パラメーターを取るメソッドに渡そうとしているため、これはコンパイルさえできません。

于 2013-08-11T22:14:35.253 に答える
1

このコードは次のとおりです。

String[] LastName= line.split(txtSplitBy);
String[] FirstName = line.split(txtSplitBy);
String[] TS = line.split(txtSplitBy);

行を数回分割して3つの異なる文字列配列を作成しているため、実際には必要ありません。行を1回分割してから、次のように配列インデックスから変数を割り当てます。

String[] splitLine = line.split(txtSplitBy);
String lastName = splitLine[0];  //first element of array
String firstName = splitLine[1]; //second element of array
String score = splitLine[2];     //third element of array

"TS"次に、スコアを文字列として解析できます。これは、変数名が必要なリテラル文字列ではなく数値になるため、省略します"

int i = Integer.parseInt (score);

次に、 while ループの反復ごとに合計を追加し、カウントを取得してから、その方法で平均を計算します。(またはスコアのリストを作成します)のように:

int total = 0;
int count = 0;
List<Integer> allScores = new ArrayList<Integer>();
while ((line = br.readLine()) != null) 
{
    String[] splitLine = line.split(txtSplitBy);
    String lastName = splitLine[0];  //first element of array
    String firstName = splitLine[1]; //second element of array
    String score = splitLine[2];     //third element of array

    System.out.println("Last Name: " + lastName 
                         + "\n" +"First Name: " + firstname + "\n" + 
                        "Test Score: " + score + "\n") ;

    int i = Integer.parseInt (score);
    total += i;
    count++;
    // Add to List
    allScores.add(i);
}
double average = total/count;

リストをループするには

for( Integer i: allscores)
{
    // Do the appropriate code here
}

名前も必要な場合は、firstName、lastName、およびスコアを保持するクラスを作成してから、これらをリストに追加する必要があります。

クラスに関するこのチュートリアルを参照してください

于 2013-08-11T22:17:46.623 に答える