2011-07-05 131 views
1

我有一個固定長度爲9的向量,帶有一些對象。每個對象都有一個變量值:Point和vector應該被排序,使得值更高的對象首先出現 - 如果他們的value.x相同,那麼value.y更小的那個應該是第一個。AS3排序向量不像預期的那樣行爲

這是我比較功能:

private function cmpr(h1:HelpObj, h2:HelpObj):Number{ 
     var res:Number; 
     if(h1.value.x==h2.value.x){ 
      res = h1.value.y-h2.value.y; 
      return res; 
     } 
     else{ 
      res = h2.value.x-h1.value.x; 
      return res; 
     } 
    } 

但你可以在這個截圖中看到,所產生的順序是不是它應該是:

problem

我在做什麼錯誤?

回答

6

比較函數收到參數ab

它必須返回

  • -1,如果a具有前b
  • 0如果ba位置等於被放置
  • 1如果a必須放置b

您將返回任何值,而不僅僅是列出的三個值,這就是爲什麼訂單變得混亂。

比較以下示例中的結果。

var test:Vector.<Number>; 

// returning whatever the difference is 
var sortMethod1:Function = function (a:Number, b:Number) : Number 
{ 
    var value:Number = a-b; 
    trace(a+"\t"+b +"\t= "+ value); 
    return value; 
} 

// returning -1, 0, 1 
var sortMethod2:Function = function (a:Number, b:Number) : int 
{ 
    var result:int; 
    if (a < b) { 
     result = -1; 
    } else if (a > b) { 
     result = 1;  
    } else { 
     result 0; 
    } 
    trace(a+"\t"+b +"\t: "+ result); 
    return result; 
} 

test = new <Number>[1.2,1.1,1.4,1.5,0]; 
trace("BEFORE", test); 
test.sort(sortMethod1); 
trace("AFTER1", test); 

trace("--"); 

test = new <Number>[1.2,1.1,1.4,1.5,0]; 
trace("BEFORE", test); 
test.sort(sortMethod2); 
trace("AFTER2", test); 

/* 
Trace output: 

BEFORE 1.2,1.1,1.4,1.5,0 
1.1 1.4 = -0.2999999999999998 
1.2 1.4 = -0.19999999999999996 
1.5 1.4 = 0.10000000000000009 
0 1.4 = -1.4 
0 1.4 = -1.4 
1.1 1.2 = -0.09999999999999987 
0 1.2 = -1.2 
1.5 1.2 = 0.30000000000000004 
1.5 1.2 = 0.30000000000000004 
0 1.2 = -1.2 
0 1.1 = -1.1 
AFTER1 0,1.1,1.2,1.5,1.4 
-- 
BEFORE 1.2,1.1,1.4,1.5,0 
1.1 1.4 : -1 
1.2 1.4 : -1 
1.5 1.4 : 1 
0 1.4 : -1 
1.5 1.4 : 1 
0 1.4 : -1 
0 1.1 : -1 
1.1 1.2 : -1 
AFTER2 0,1.1,1.2,1.4,1.5 
*/ 

編輯在你的情況,這將是以下幾點:

private function cmpr(h1:HelpObj, h2:HelpObj):int 
{ 
    var hx1:Number = h1.value.x; 
    var hx2:Number = h2.value.x; 
    if (hx1 < hx2) {  
     return -1; 
    } 
    if (hx1 > hx2) {  
     return 1; 
    } 
    var hy1:Number = h1.value.y; 
    var hy2:Number = h2.value.y; 
    if (hy1 < hy2) {  
     return -1; 
    } 
    if (hy1 > hy2) {  
     return 1; 
    } 
    return 0; 
} 
+0

但AS3幫助各國:'的方法需要一個參數。參數是以下值之一: 函數,它接受Vector的基本類型(T)的兩個參數並返回一個數字: function compare(x:T,y:T):Number {} 邏輯的函數是,給定兩個元素x和y,函數返回以下三個值之一: 一個負數,如果x應該出現在排序序列中y之前 0,如果x等於y 是一個正數,如果x在排序後的序列中出現在y之後# – Mat

+0

@Nox是正確的,則必須返回-1,0或1,否則其他任何事情都會將事情搞砸,無視文檔所說的內容。這是我一段時間後的一個小測試:http://wonderfl.net/c/rK5r – grapefrukt

+0

我不太確定他們自己的文檔中哪裏錯了,但顯然是這樣。我編輯了我的第一個示例,以便在快速排序步驟中看到差異。 –

5

有同樣的問題。 Vector.sort()函數有一個錯誤。 如果用浮點數的工作,你不應該返回小的數字像-0.0034 所以......

someSortFunc(a:SomeObject , b:SomeObject):Number 
{ 
    return a.val - b.val; //unexpected results 
} 

someSortFunc(a:SomeObject , b:SomeObject):Number 
{ 
    return 1000 * (a.val - b.val); //correct results 
} 

因此更好地利用-1,1或0 :)