在动作脚本中对多维数组进行排序
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()
根据数组中的属性对数组中的元素进行排序。该数组应具有以下特征:
- 数组是索引数组,不是关联数组。
- 数组的每个元素都包含一个具有一个或多个属性的 object。
- 所有对象至少有 一个 属性 共同点,其值可用于对数组进行排序。
那么,这是一个数组:
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])
}
}
}
目前我正在尝试将 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()
根据数组中的属性对数组中的元素进行排序。该数组应具有以下特征:
- 数组是索引数组,不是关联数组。
- 数组的每个元素都包含一个具有一个或多个属性的 object。
- 所有对象至少有 一个 属性 共同点,其值可用于对数组进行排序。
那么,这是一个数组:
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])
}
}
}