2012-04-03 15 views
0

数値配列があり、中央値を計算したいと思います。 配列が奇数の場合、奇妙な数字が出てきても計算はOKです。ActionScript 3での中央値計算

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がアレイに位置されなければなりません。

誰かが助けてもらえますか?

答えて

3

は(tidyness用)、これを試してみてください:

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; 

をあなたは文字通り2文字列1.5を追加し、3.5ではなく21.5を取得している意味。

median = (Number(sortnums[mid1]) + Number(sortnums[mid2]))/2; 
+1

完全なサイドノートでは、あなたがサニタイズすべきであり、あなたの文字列値が数値のものに変換し、前にあなたがあなたの計算を行います。

は、それがそうのように読み込むようにコードを修正してください。 – joncys

+0

@joncysはい、それはもちろん当然です。私の初期関数は、これを行うための数値がすでに入っている配列をとります。 – Marty

+0

[at] Marty - このコメントは、あなたの答えではなく、私の間違いではなく、OPの投稿にコメントとして出さなければならなかった。 (とにかくスペースを入れて名前を引用する方法は?) – joncys

関連する問題