2016-05-05 8 views
0

Momentan versuche ich ein 16x4 Array in ein 16x2 Array zu konvertieren. Ich mache das, indem ich die 4 Zeilen summiere und dann den Zeilenwert als Schlüssel zuweise (daher könnte Fitness [0,0] [x, 0] sein und Fitness [1,0] wäre [y, 1]) danach Ich möchte das Fitness-Array mit der sortOn-Methode nach der ersten Spalte (x und y in meinem Beispiel) sortieren. Aus irgendeinem Grund funktioniert das nicht. Gibt es einen Vorschlag, was mit meinem Code nicht stimmt?Mehrdimensionale Arrays in Actionscript sortieren

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"); 

Antwort

0

Sie sollten sich bewusst sein, dass sortOn() sortiert die Elemente in einem Array nach Eigenschaften in der Anordnung. Das Array sollte die folgenden Merkmale aufweisen:

  1. Das Array ist ein indiziertes Array, kein assoziatives Array.
  2. Jedes Element des Arrays enthält eine object mit einer oder mehreren Eigenschaften.
  3. Alle Objekte haben mindestens eine Eigenschaft gemeinsam, deren Werte verwendet werden können, um das Array zu sortieren.

Also, dies ist ein Array:

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

Dies ist ein Objekt (auch bekannt als assoziatives Array):

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

Und das ist die Art von Struktur, dass Die Methode sortOn() gilt für:

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

Auch wenn Sie eine Variable das Muster NAME:TYPE = VALUE ist zu erklären, und nicht NAME = TYPE

Hier ist der entsprechende Code. Sie haben die Funktion print() hinzugefügt, die den Inhalt eines Arrays abbildet, so dass Sie das Vorher und Nachher sehen können.

/* --- 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]) 
     } 
    } 
}