0

私は仕事を得ました。Java Decathlon プログラムの入力は、CSV のようなテキスト ファイルです。タスクは、すべての選手を順位の昇順に並べた XML ファイルを出力することです。このファイルには、すべての入力データと合計スコア、および競技会の順位が含まれています (同点の場合、選手は順位を共有する必要があります (例: 3-4 と3 と 4 の代わりに 3-4)

これは私の cvs ファイルです:

Jana Kari;12.61;5.00;9.22;1.50;60.39;16.43;21.60;2.60;35.81;5.25.72 
Eva Narun;13.04;4.53;7.79;1.55;64.72;18.74;24.20;2.40;28.20;6.50.76 
Maja Hope;13.75;4.84;10.12;1.50;68.44;19.18;30.85;2.80;33.88;6.22.75 
Kirke Kanda;13.43;4.35;8.64;1.50;66.06;19.05;24.89;2.20;33.48;6.51.01

十種競技ごとにこれらの定数を取得しました

double[] A = new double[]{25.4347,0.14354,51.39,0.8465,1.53775,5.74352,12.91,0.2797,10.14,0.03768};
double[] B = new double[]{18,220,1.5,75,82,28.5,4,100,7,480};
double[] C = new double[]{1.81,1.4,1.05,1.42,1.81,1.92,1.1,1.35,1.08,1.85};

ポイントの計算式は

Points = INT(A(B — P)^C) for track events (faster time produces a better score)
Points = INT(A(P — B)^C) for field events (greater distance or height produces a better score)

"P" は個人レコード (cvs から) です。ファイルから適切に読み取る方法を本当に理解していないので、数値のみで計算を行うことができます。cvs ファイルに 2 次元配列を使用する必要がありますか? 非常に紛らわしく、立ち往生しています。

編集

後でxmlファイルに出力するには、1次元配列の方が優れていると思います。私の仕事のポイントはコードの単純さですが、CVS ファイルは N 行に展開される可能性があるため、行数がわかりません。このコードで数値配列を使用したい:

 double[] A = new double[]{25.4347,0.14354,51.39,0.8465,1.53775,5.74352,12.91,0.2797,10.14,0.03768};
 double[] B = new double[]{18,220,1.5,75,82,28.5,4,100,7,480};
 double[] C = new double[]{1.81,1.4,1.05,1.42,1.81,1.92,1.1,1.35,1.08,1.85};
 double PTS;
 double finalscore;

    for (int i = 0; i < P.length;i++ )
    {
    finalscore=0;
        if (i == 0)
        {
            PTS = A[i]* Math.pow((P[i]-B[i]),C[i]);
        }
           else if   (i == 4)
            {
            PTS = A[i]* Math.pow((P[i]-B[i]),C[i]);
            }
            else if (i == 5 || i == 9)
            {
            PTS = A[i]* Math.pow((P[i]-B[i]),C[i]);
            }
        else
        {
        PTS = A[i]* Math.pow((P[i]-B[i]),C[i]);
        }

        finalscore = finalscore + PTS;
    }
  System.out.println(finalscore);
}

}

P[] は、名前のない番号の配列の最初のレーンになります。PS上記のコードを使用すると、結果NaNが得られるようです

 double[] P = new double[]{12.61,5.00,9.22,1.50,60.39,16.43,21.60,2.60,35.81,5.272};
4

1 に答える 1

0

はい、あなたの考えは正しいです。2 次元配列を使用できます。というクラスを作成することもお勧めします。Personこれは Java プログラミングであり、Java はオブジェクト指向であるためです。ただし、複数のクラスの作成についてまだ学習していない場合は、そのビットをスキップして、2 つの配列 (1 つは 1 次元) で行うことができます。名前の配列と数値の 1 つの 2 次元配列。

1 次元配列アプローチの場合

public class Person {
   String name;
   double[] scores;
   int minutes;
   int seconds;
   int hundredths;

   public Person(String line) {
      String[] splitted = line.split(";");
      name = splitted[0];
      // now fill in the other fields
      for(int i = 1; i < splitted.length - 1; i++) {
         scores[i - 1] = Double.parseDouble(splitted[i]);
      }
      String times = splitted[splitted.length - 1].split("\\.");
      minutes = Integer.parseInt(time[0]);
      // etc. - fill in the rest
   }
}

(実際には、これは間違っている可能性があります。ほとんどの数値はスコアであると想定していたためです。しかし、実際には数秒から 100 分の 1 秒であると思います。これらのイベントに 1 分以上の時間を割くことができない限り、それは問題ではありません。 .)

次に、他のクラスに Person オブジェクトの配列を用意する必要があります。うまくいけば、十分大きくなるようにかなり大きくしましょう。

Person[] array = new Person[10000];

これでループができline、ファイルから a を読み取るたびに、コンストラクターを呼び出すだけです。

array[j] = new Person(line);

いいアプローチですね。

于 2013-11-10T10:01:18.047 に答える