0

配列を並べ替えて、どちらが大きいかを見つけようとしています。したがって、元の配列 (CurMobRM)、同じ値を持つが並べ替えられて反転された配列 (Ary) と、元の配列の値の位置を持つ配列 (チェック) があります。

簡単な例は、元の値が (3,8,5,2,7) で、それらを並べ替えて、同じ値で異なる位置 (8,7,5,3,2) の配列があるとします。 ) と、すべての値 (3,0,2,4,1) の元の位置を持つ最終的な配列。

var CurMobRM:Array = new Array (3,8,5,2,7);
var checking:Array= new Array;
putattackorder();

function putattackorder() {
    var Ary:Array = CurMobRM;
    var lo:Number;
    Ary.sort ();
    Ary.reverse ();
    trace (Ary)
    for (lo = 0; lo < 5; lo++) {
        for (loop = 0; loop < 5; loop++) {
            if (Ary[lo] == CurMobRM[loop]) {
                checking[lo] = loop
            }
        }
    }
    trace (checking)
    trace (Ary)
    trace (CurMobRM)
}

問題は、Ary をソートすると、CurMobRM も同時にソートされているように見えることです...理由がわかりません。トレース (チェック) は常に 0,1,2,3,4 を返します

4

1 に答える 1

3

これは、ActionScript 3arrayオブジェクトがではなく参照によって割り当てられるために発生します。これを克服するには、パラメーターなしでメソッドを使用できます (スライス全体の配列)。slice

たとえば、コードでは次のようになります。

var CurMobRM:Array = new Array (3,8,5,2,7);
var checking:Array= new Array;
putattackorder();

function putattackorder()
{
    //perform a copy by value of array
    var Ary:Array = CurMobRM.slice();

    var lo:uint;
    var loop:uint;

    Ary.sort();

    //not necessary?
    //Ary.reverse();
    //trace (Ary)

    for (lo = 0; lo < 5; lo++) {
        for (loop = 0; loop < 5; loop++)
        {
            if (Ary[lo] == CurMobRM[loop])
            {
                checking[lo] = loop
            }
        }
    }

    trace (checking)
    trace (Ary)
    trace (CurMobRM)
}

出力は次のとおりです。

3,0,2,4,1

2,3,5,7,8

3,8,5,2,7

私はそれがあなたが探しているものだと信じています。お役に立てれば幸いです。

于 2012-10-23T22:23:42.003 に答える