0

我有一个任务。Java 十项全能程序的输入是一个类似 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 文件使用二维数组吗?它非常令人困惑,我被卡住了。

编辑

好吧,我相信稍后输出到 xml 文件一维数组会更好。我的任务的重点是代码简单,但 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

是的,你有正确的想法——你可以使用二维数组。我还建议您创建一个名为 的类Person,因为这是 Java 编程,而 Java 是面向对象的,但如果您还没有研究过创建多个类,您可以跳过该部分,只使用两个数组,一个一维的名称的数组和数字的一个二维数组。

对于一维数组方法

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
   }
}

(实际上,这可能是错误的,因为我假设大多数数字都是分数,但我猜它们实际上是秒和百分之一秒。这并不重要,除非你有超过一分钟的时间来参加这些活动.)

然后你需要在你的另一个类中有一个 Person 对象数组——让我们把它做得很大,这样它就有希望足够大了:

Person[] array = new Person[10000];

现在有一个循环,每当您line从文件中读取 a 时,您只需调用构造函数。

array[j] = new Person(line);

不错的方法,不是吗?

于 2013-11-10T10:01:18.047 回答