我正在编写一段代码需要帮助。我想计算一个数组的中位数。最初的类型都是整数,它用整数除法计算中位数,这给了我一个错误的答案。我将所有内容都更改为双打,但是我遇到了类型不匹配错误,说我无法将双打转换为不真正有意义的整数。有人可以帮忙吗这是我的代码:
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]
顺便说一下这不是作业
答案 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)
您使用双值arrayHalfEven
和arrayHalfOdd
索引到数组。
答案 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;
即使数组项是整数,也不会得到整数除法。