Java中位数错误

时间:2012-03-09 23:20:17

标签: 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]

顺便说一下这不是作业

5 个答案:

答案 0 :(得分:1)

你不能使用double作为数组索引:arrayHalfOdd和arrayHalfEven

让那些家伙整理。

答案 1 :(得分: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));

答案 2 :(得分:1)

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

答案 3 :(得分: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];
        }
    }

答案 4 :(得分:0)

这一行

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

和这一行

median = myValues[arrayHalfOdd];

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

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

只有当两个方程的分子和分母都是整数时,才会发生整数除法。数组索引不是分子或分母的一部分;他们从数组中选择分子。

因此,如果数组的元素(分子)是双精度数,则不会得到整数除法。如果你希望它们是整数,你仍然可以通过使你的文字分母成为双精度来防止整数除法,如下所示:

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

即使数组项是整数,也不会得到整数除法。