Flash-Browser-App Actionscript: wie eine Teilmenge von Objekten aus einem sortierten Array zu extrahieren * effizient *?

StackOverflow https://stackoverflow.com/questions/2133252

Frage

Ich habe einen Browser-entfalteten Flash-App (keine AIR-Anwendung mit Zugriff auf SQLConnection-) und es holt JSON Ergebnisse von einem remoten Server über Http.

ich brauche Subsets aus dem zurückgegebenen Ergebnismenge zu extrahieren, ein Array von Objekten, effizient . Mutltiple ruft durch die Wolke auf das Back-End nicht tun. Das alles hat die clientseitige passieren.

Gibt es eine Sammlung Klasse in Flex Actionscript, die ein Array von Objekten durch eine der Eigenschaften haben alle Objekte gemeinsam sortieren, wie das Array sortOn Methode, und dann stellt auch einen binäre Suche Methode eine Teilmenge von Objekten aus der sortierten Version des Arrays extrahieren ohne jedes Element im Array zu besuchen und zu vergleichen

z. wenn ich ein Array von Objekten haben und jedes Objekt hat eine zip Eigenschaft und ein Namen Eigenschaft, würde ich alle Objekte zu können, wie extrahieren mit zip = 10015 aus der einer Kopie des Original-Array, in dem die Kopie auf zip .

Danke

War es hilfreich?

Lösung

Ich bin nicht bekannt, dass integrierte Sammlung, die eine binäre Suche funktioniert. Aber man kann das Array sortiert mit den Array::sortOn Verfahren und Ihren eigenen Code für binäre Suche schreiben. Sie können mit etwas beginnen wie:

private static search(array:Array, prop:String, value:Object, 
        frm:Number, to:Number):Number
{
  if(to - frm <= 1)
  {
    if(array[frm][prop] == value)
      return frm;
    if(array[to][prop] == value)
      return to;
    return -1;
  }
  var mid:int = (to + frm) / 2;
  //use a compare function that returns -1, 0, +1 based on their relative values
  if(array[mid][prop] == value)
    return mid;
  if(array[mid][prop] > value)
    return search(array, prop, value, frm, mid - 1);
  return search(array, prop, value, mid + 1, to);
}
array.sortOn("zip", Array.NUMERIC);
var index:Number = ClassName.search(array, "zip", "10015", 0, array.length - 1);

Jetzt können Sie suchen nach oben und unten aus dem Indexwert zurückgegeben (wenn es! = -1) und rufen Sie die ganze Teilmenge mit Zip-Wert = 10015.


Btw, wenn die Daten zu groß sind normal Methoden auf der Clientseite gesucht zu werden, wäre es nicht groß genug sein, zu einer Bandbreite Engpass zu sein?

Andere Tipps

Sie könnten array.sortOn() verwenden und dann Iterierte einmal über die sortierten Array (ab 0): Wenn Sie das erste Spiel zu erreichen, starten Elemente, wie Sie Iterierte Rückkehr nach vorne, bis Sie passende stoppen. Dadurch wird die gesamte Teilmenge der Anpassungselemente und im Durchschnitt werden Sie nur die Hälfte des ursprünglichen Array besuchen (nach dem Sortieren).

(Wenn diese zu langsam ist, kann es schneller sein, auf Ihren Daten abhängig, eine binäre Suche zu verwenden, um ein Spiel zu bekommen, dann wiederholen, bis Sie aufhören passende dh das erste Spiel in der geordneten Menge finden, dann beginnen Rückkehr Elemente, wie Sie Iterierte nach oben, bis Sie aus den Spielen laufen ... aber die Zeitersparnis könnten die Zeit im Vergleich tun muß, um die ursprüngliche sortOn ())

marginal
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top