Медианный расчет в ActionScript 3 - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть массив чисел, и я хотел бы рассчитать медиану.Когда массив нечетный, вычисление в порядке, когда появляется даже странное число.

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 - это позиция вмассив.

Может ли кто-нибудь помочь?

1 Ответ

3 голосов
/ 03 апреля 2012

Попробуйте (для удобства):

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...