Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 向量上的AS3排序行为不符合预期_Actionscript 3_Sorting_Vector - Fatal编程技术网

Actionscript 3 向量上的AS3排序行为不符合预期

Actionscript 3 向量上的AS3排序行为不符合预期,actionscript-3,sorting,vector,Actionscript 3,Sorting,Vector,我有一个固定长度的向量9和一些物体。每个对象都有一个可变值:点和向量应进行排序,以使具有较高值.x的对象首先出现-如果YR值.x相同,则具有较小值.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

我有一个固定长度的向量9和一些物体。每个对象都有一个可变值:点和向量应进行排序,以使具有较高值.x的对象首先出现-如果YR值.x相同,则具有较小值.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;
        }
    }
但正如你在这个屏幕截图上看到的,结果的顺序不是它应该的:


我做错了什么?

比较函数接收参数a和b

它必须回来

-1如果a必须放在b之前 如果b和a的位置相等,则为0 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;
}

比较函数接收参数a和b

它必须回来

-1如果a必须放在b之前 如果b和a的位置相等,则为0 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;
}
我也有同样的问题。 Vector.sort函数有一个bug。 如果使用浮点数,则不应返回-0.0034之类的小数值 所以

所以最好使用-1、1或0:

也有同样的问题。 Vector.sort函数有一个bug。 如果使用浮点数,则不应返回-0.0034之类的小数值 所以


因此最好使用-1、1或0:

,但AS3帮助说明:该方法采用一个参数。该参数是以下参数之一:一个函数,它接受向量基类型T的两个参数并返回一个数字:函数comparex:T,y:T:Number{}该函数的逻辑是,给定两个元素x和y,该函数返回以下三个值之一:负数,如果x在排序序列0中出现在y之前,如果x等于y是一个正数,如果x在排序序列中出现在y之后sequence@Nox如果是正确的,您必须返回-1、0或1,否则会把事情搞砸,不管文档怎么说。这是我不久前做的一个小测试:我不太确定他们在自己的文档中哪里错了,但很明显是这样。我已经编辑了我的第一个示例,以便您可以看到快速排序步骤中的差异。我猜在快速排序算法中,Number和int之间会发生一些内部类型转换。@Mat-您引用的是什么文档?AS3开发指南将-1、0、1作为自定义比较函数的返回值。但是AS3帮助声明:该方法只接受一个参数。该参数是以下参数之一:一个函数,它接受向量基类型T的两个参数并返回一个数字:函数comparex:T,y:T:Number{}该函数的逻辑是,给定两个元素x和y,该函数返回以下三个值之一:负数,如果x在排序序列0中出现在y之前,如果x等于y是一个正数,如果x在排序序列中出现在y之后sequence@Nox如果是正确的,您必须返回-1、0或1,否则会把事情搞砸,不管文档怎么说。这是我不久前做的一个小测试:我不太确定他们在自己的文档中哪里错了,但很明显是这样。我已经编辑了我的第一个示例,以便您可以看到快速排序步骤中的差异。我猜在快速排序算法中,Number和int之间会发生一些内部类型转换。@Mat-您引用的是什么文档?AS3开发指南将-1、0、1作为自定义比较函数的返回值。