比較函數收到參數a
和b
。
它必須返回
- -1,如果
a
具有前b
- 0如果
b
和a
位置等於被放置
- 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;
}
但AS3幫助各國:'的方法需要一個參數。參數是以下值之一: 函數,它接受Vector的基本類型(T)的兩個參數並返回一個數字: function compare(x:T,y:T):Number {} 邏輯的函數是,給定兩個元素x和y,函數返回以下三個值之一: 一個負數,如果x應該出現在排序序列中y之前 0,如果x等於y 是一個正數,如果x在排序後的序列中出現在y之後# – Mat
@Nox是正確的,則必須返回-1,0或1,否則其他任何事情都會將事情搞砸,無視文檔所說的內容。這是我一段時間後的一個小測試:http://wonderfl.net/c/rK5r – grapefrukt
我不太確定他們自己的文檔中哪裏錯了,但顯然是這樣。我編輯了我的第一個示例,以便在快速排序步驟中看到差異。 –