Mat*_*Mat 1 sorting vector actionscript-3
我有一个固定长度9的矢量与一些对象.每个对象都有一个变量值:Point和vector应该被排序,使得value.x值较高的对象首先出现 - 如果它们的值x相同,那么value.y值较小的对象应该是第一个.
这是我的比较功能:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
但正如您在此屏幕截图中看到的那样,生成的顺序不是它应该是的:

我究竟做错了什么?
比较函数接收参数a和b.
它必须回归
a必须放在之前bb和的a位置相等,则为0a必须放在后面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
*/
Run Code Online (Sandbox Code Playgroud)
编辑在您的情况下,将是以下内容:
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;
}
Run Code Online (Sandbox Code Playgroud)
有同样的问题.Vector.sort()函数有一个bug.如果您使用浮动数字,则不应返回-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
}
Run Code Online (Sandbox Code Playgroud)
所以最好使用-1,1或0 :)