2016-04-25 84 views
1

使用下面的代码,当输出到GUI中的标签时,变量(double)dAvgRun1,dAvgRun2(因此变量dBest)以NaN形式返回。Java计算双打 - NaN

我在做我的双打NaN的代码时犯了什么错误?

  double [][] daRun = new double[2][7]; 

      //Sets Athlete Name and Nationality labels to selected athlete in JList 
      jLabel_Athlete.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).sName); 
      jLabel_Country.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).sCountry); 

      //Returns all scores for selected athlete 
      jTextField_Run1_0.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[0]); 
      jTextField_Run1_1.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[1]); 
      jTextField_Run1_2.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[2]); 
      jTextField_Run1_3.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[3]); 
      jTextField_Run1_4.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[4]); 
      jTextField_Run1_5.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[5]); 
      jTextField_Run1_6.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun1[6]); 

      jTextField_Run2_0.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[0]); 
      jTextField_Run2_1.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[1]); 
      jTextField_Run2_2.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[2]); 
      jTextField_Run2_3.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[3]); 
      jTextField_Run2_4.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[4]); 
      jTextField_Run2_5.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[5]); 
      jTextField_Run2_6.setText(vecAthlete.get(jList_Athlete.getSelectedIndex()).saTempRun2[6]); 

      //Parse all scores from string to double 
      daRun[0][0] = Double.parseDouble(jTextField_Run1_0.getText()); 
      daRun[0][1] = Double.parseDouble(jTextField_Run1_1.getText()); 
      daRun[0][2] = Double.parseDouble(jTextField_Run1_2.getText()); 
      daRun[0][3] = Double.parseDouble(jTextField_Run1_3.getText()); 
      daRun[0][4] = Double.parseDouble(jTextField_Run1_4.getText()); 
      daRun[0][5] = Double.parseDouble(jTextField_Run1_5.getText()); 
      daRun[0][6] = Double.parseDouble(jTextField_Run1_6.getText()); 

      daRun[1][0] = Double.parseDouble(jTextField_Run2_0.getText()); 
      daRun[1][1] = Double.parseDouble(jTextField_Run2_1.getText()); 
      daRun[1][2] = Double.parseDouble(jTextField_Run2_2.getText()); 
      daRun[1][3] = Double.parseDouble(jTextField_Run2_3.getText()); 
      daRun[1][4] = Double.parseDouble(jTextField_Run2_4.getText()); 
      daRun[1][5] = Double.parseDouble(jTextField_Run2_5.getText()); 
      daRun[1][6] = Double.parseDouble(jTextField_Run2_6.getText()); 

      //Finds maximum and minimum scores for both runs 
      int z; 
      double dMinScoreRun1 = 10, dMaxScoreRun1 = 0; 
      double dMinScoreRun2 = 10, dMaxScoreRun2 = 0; 

      for (z=0; z<daRun.length; z++) 
      { 
       if (daRun[0][z] > dMaxScoreRun1) 
       {dMaxScoreRun1 = daRun[0][z];} 
       if (daRun[0][z] < dMinScoreRun1) 
       {dMinScoreRun1 = daRun[0][z];} 

       if (daRun[1][z] > dMaxScoreRun2) 
       {dMaxScoreRun2 = daRun[1][z];} 
       if (daRun[1][z] < dMinScoreRun2) 
       {dMinScoreRun2 = daRun[1][z];} 
      } 


      //Calculates average scores 
      double dTotalRun1 = 0, dTotalRun2 = 0; 
      double dAvgRun1 = 0, dAvgRun2 = 0; 

      //Run 1 
      for (z=0; z<daRun.length; z++) 
      { 
       if(daRun[0][z] == dMaxScoreRun1 || daRun[0][z] == dMinScoreRun1) 
        continue; 
       dTotalRun1 += daRun[0][z]; 
      } 
      dAvgRun1 = dTotalRun1/(daRun.length-2); 

      //Run 2 
      for (z=0; z<daRun.length; z++) 
      { 
       if(daRun[1][z] == dMaxScoreRun2 || daRun[1][z] == dMinScoreRun2) 
        continue; 
       dTotalRun2 += daRun[1][z]; 
      } 
      dAvgRun2 = dTotalRun2/(daRun.length-2); 

      //Displays averages for both runs 
      jLabel_Average1.setText(Double.toString(dAvgRun1)); 
      jLabel_Average2.setText(Double.toString(dAvgRun2)); 

      //Compare both scores to find the best score. 
      double dBest = dAvgRun1; 

      if (dAvgRun2 > dAvgRun1) 
      { 
       dBest = dAvgRun2; 
      } 

      //Sets text of lblBestScore to the highest of the two scores 
      jLabel_Best.setText(Double.toString(dBest)); 
+0

似乎你的循环真的很小。在'dAvgRun1'的定义之后,我会在第一个循环的开头放置一个断点,然后调试应用程序。但要获得NaN,您可以将0.0除0.0。 –

+2

关于代码质量的注意事项:您不仅可以构建双精度或整数数组。您还可以构建文本字段的数组(或更好的列表)。你知道,使用具有不同名称的12个文本字段来获取将存储在数组中的值是有点疯狂的。你正在重复代码12次,这可以通过使用一个文本字段数组来大大简化。 – GhostCat

+0

@Jägermeister谢谢你的提示。我试图得到类似这样的东西来处理这个程序的前一个迭代,但我无法围绕它来包裹我的头。我一定会记得下次我需要做这样重复的事情。 – RThomP

回答

3
double [][] daRun = new double[2][7]; 

,并使用

dAvgRun1 = dTotalRun1/(daRun.length-2); 

whic会做一个dTotalRun1/0。你可能想要

dAvgRun1 = dTotalRun1/(daRun[0].length-2); 

但这也有问题。如果有多个值等于最小值或最大值会怎么样?你应该算:

int cnt = 0; 
for (z=0; z<daRun.length; z++){ 
    if(daRun[0][z] == dMaxScoreRun1 || daRun[0][z] == dMinScoreRun1) 
      continue; 
    dTotalRun1 += daRun[0][z]; 
    cnt++; 
} 

if(cnt != 0){ 
    dAvgRun1 = dTotalRun1/cnt; 
} else { 
    // ? not sure what to use here 
} 
+0

优胜者冠军鸡晚餐!谢谢@laune,通过确保我使用daRun [0] .length,无论我以前只有daRun.length,问题已修复! – RThomP

+0

至于最大或最小值的重复,是的,过去已经显示为有问题,尽管看到这是一项大学任务(并且这种情况还没有被指定),我现在将会保存我的努力。不过,我很高兴你指出! – RThomP

0

我认为问题就出在这里:for (z=0; z<daRun.length; z++) daRun.length将返回2,而不是7正如您所料。