在动作脚本中对多维数组进行排序

Sorting multidimensional arrays in actionscript

目前我正在尝试将 16 x 4 数组转换为 16 x 2 数组。我这样做是通过对 4 行求和然后将行值指定为键(因此 fitness[0,0] 可以是 [x,0] 而 fitness[1,0] 可以是 [y,1])我想使用 sortOn 方法按第一列(我的示例中的 x 和 y)对适应度数组进行排序。由于某种原因,这是行不通的。关于我的代码有什么问题有什么建议吗?

var i = int;
var j = int;
var temp = int;
var sum = int;
sum = 0;
for (i = 0; i <16; i++) {
    for (j = 0; j < 4; j++) {
        temp = genotype[i][j];
        sum = sum + temp;
    }
    fitness[i] = [sum,i];
    sum = 0;
}

fitness.sortOn("0");

您应该知道 sortOn() 根据数组中的属性对数组中的元素进行排序。该数组应具有以下特征:

  1. 数组是索引数组,不是关联数组。
  2. 数组的每个元素都包含一个具有一个或多个属性的 object
  3. 所有对象至少有 一个 属性 共同点,其值可用于对数组进行排序。

那么,这是一个数组:

var a:Array = ["a", "b", "c"]

这是一个对象(a.k.a。关联数组):

var o:Object = {"name":"Tom", "age":21, "single":true}

这是sortOn()方法适用的结构类型:

var a:Array = [
    {"name":"Tom", "age":21, "single":true},
    {"name":"Dick", "age":36, "single":false},
    {"name":"Harry", "age":27, "single":true}
]

此外,当您声明一个变量时,模式是 NAME:TYPE = VALUE,而不是 NAME = TYPE

这是合适的代码。您添加了 print() 函数来追踪数组的内容,以便您可以看到之前和之后。

/* --- Code that wasn't provided --- */
// This creates the data so we can test sorting it.

var genotype:Array = [];
for (var r:int = 0; r < 16; r++) {
    var row:Array = [];
    for (var c:int = 0; c < 4; c++) {
        row.push(Math.floor(Math.random() * 100));
    }
    genotype.push(row)
}

var fitness:Array = [];

/* --- Modified Original Code --- */
// Loop through the genotype, and create entries in fitness with the sum and index
for (var i:int = 0; i < genotype.length; i++) {
    fitness[i] = {"sum":sumArray(genotype[i]), "index":i};
}

function sumArray(a:Array):Number {
    // This simply adds up the total values in an array.
    var sum:int = 0;
    for (var i:int = 0; i < a.length; i++) {
        sum += a[i];
    }
    return sum;
}

fitness.sortOn("sum", Array.NUMERIC);  // Sort on the sum property, numerically ascending.


// To sort the original data, I'm going to place it into a new array.
var newGeno:Array = [];
i = 0;
for each (var entry:Object in fitness) {
    newGeno[i] = genotype[entry.index];
    i++;
}

/* If you want, you can replace the original, simply add...
    genotype = newGeno;
*/

trace("--- GENOTYPE ---")
print(genotype);

trace("--- NEW GENO ---")
print(newGeno);

function print(a:Array, prefix:String = ""):void {
    for (var i:int = 0; i < a.length; i++) {
        if (a[i] is Array) {
            trace(prefix + i + ": [Array] " + sumArray(a[i]));
            print(a[i], prefix + "    ");
        } else {
            trace(prefix + i + ": " + a[i])
        }
    }
}