我有一个数字数组,我想计算中位数。 当数组是奇数时,计算就可以了,甚至出现奇怪的数字。
private var numbers:String = "2,5,3,4,6,1";
private var array:Array = numbers.split(",");
private function getMedian(array:Array):Number {
var sortnums:Array = array.sort(Array.NUMERIC);
var length:Number = sortnums.length;
var mid1:Number; var mid2:Number; var median:Number;
if(length % 2 == 0){
mid1 = length / 2; trace("mid1: "+mid1);
mid2= ((length - 1) / 2)-0.5; trace("mid2: "+mid2);
trace ("mid1: "+sortnums[mid1]+", mid2: "+sortnums[mid2]);
median = (sortnums[mid1] + sortnums[mid2]) / 2;
}else{
mid1 = (length / 2)-0.5
median = sortnums[mid1]
}
trace (median);
return median;
}
结果是21.5,但应该是3.5
mid1和mid2是阵列中的一个位置。
有人可以帮忙吗?
答案 0 :(得分:3)
试试这个(整洁):
function getMedian(plug:Array):Number
{
// Even length.
if(plug.length % 2 == 0)
{
var a:Number = plug[int(plug.length / 2) - 1];
var b:Number = plug[int(plug.length / 2)];
return (a + b) / 2;
}
// Odd length.
return plug[int(plug.length / 2)];
}
// Tests.
trace(getMedian([2,5,3,4,6,1])); // 3.5
trace(getMedian([2,5,3,4,6])); // 3
顺便说一下,我相当肯定你的代码工作正常,问题是你在这里做了一个字符串连接而不是数字总和:
median = (sortnums[mid1] + sortnums[mid2]) / 2;
意味着你真的将字符串 1.5
添加到2
并获取21.5
而不是3.5
。
尝试修改您的代码,使其如下所示:
median = (Number(sortnums[mid1]) + Number(sortnums[mid2])) / 2;