2012-03-09 79 views
1

我需要帮助我写一段代码。我想计算一个数组的中位数。最初这些类型都是整数,并且用整数除法得出中值,这给了我一个错误的答案。我改变了一切双打,但我得到一个类型不匹配的错误,说我不能将双打转换为没有意义的整数。有人可以帮忙吗?这是我的代码:Java中位错误

public class MedianTest { 

    public static void main(String[] args) { 

     double median = 0; 
     double myValues[] = { 1, 2, 3, 4 }; 

     double arrayHalfOdd = ((myValues.length - 1)/2) + 1; 
     double arrayHalfEven = ((myValues.length - 1)/2); 

     if ((myValues.length - 1) % 2 == 0) { 
     median = (myValues[arrayHalfEven] + myValues[arrayHalfEven + 1])/2; 
     } else { 
     median = myValues[arrayHalfOdd]; 
     } 
     System.out.print(median); 
    } 

} 

的错误是在myValues [arrayHalfEven]和myValues [arrayHalfOdd]

通过这不是功课

+3

不要忘记让你的代码安全只对一个元素列表... – Adam 2012-03-09 23:24:28

回答

1

最终的答案:

if (myValues.length == 0) { 
     throw new IllegalStateException(); 
    } 
    else if (myValues.length == 1) { 
     return myValues[0]; 
    } 
    else { 
     int halfRoundedUp = myValues.length/2; 
     if (myValues.length % 2 == 0) { // even count, average the middle values 
      return (myValues[halfRoundedUp - 1] + myValues[halfRoundedUp])/2; 
     } 
     else { // odd, take the middle value 
      return myValues[halfRoundedUp]; 
     } 
    } 
1

不能使用双阵列作为的方式index:arrayHalfOdd和arrayHalfEven

使这些家伙ints。

1

如果我理解你的话,你可以使用Math.round(double d)或Math.trunc(double d);

int arrayHalfOdd = Math.round(((myValues.length - 1)/2)) + 1; 
int arrayHalfEven = Math.round(((myValues.length - 1)/2)); 
1

您使用双值arrayHalfEvenarrayHalfOdd将数组索引到数组中。

0

此行

median = (myValues[arrayHalfEven] + myValues[arrayHalfEven + 1])/2; 

这行

median = myValues[arrayHalfOdd]; 

使用的是双变量arrayHalfEven和arrayHalfOdd作为数组索引。如果编译器允许使用双数组索引,则可以尝试访问非整数数组索引处的位置(例如array [1.5]),这会导致疯狂的内存访问并发症。所以,它会抛出一个错误。

幸运的是,arrayHalfEven和arrayHalfOdd的类型不影响编译器是否使用整数除法。

整数除法只有在均为时,方程的分子和分母才是整数。数组下标不是分子或分母的一部分;他们选择来自阵列的分子。

所以如果数组元素(分子)是双打的,你不会得到整数除法。如果你想他们是整数,你仍然可以防止整数除法通过使您的文字分母双,这样的:

median = (myValues[arrayHalfEven] + myValues[arrayHalfEven + 1])/2.0; 

那么你不会得到整数除法即使数组项是整数。