Griever: Array Numerisch Sortieren (Größte Zahl zuerst ...)

Hi.

Gibt es ein Scriptbeispiel/Funktion/Prototype, mit dem man ein Array sortieren kann.

Dabei möchte ich aber, dass das Array (Mehrdimensional) nach einem numerischen Wert sortiert wird.

Also ich habe:

  
Liste = new Array()  
Liste[0] = new Array("Name",1000)  
Liste[1] = new Array("Name",100)  
Liste[2] = new Array("Name",10000)  
Liste[3] = new Array("Name",0)  
Liste[4] = new Array("Name",10)  

Dazu muss ich aber auch sagen, dass die Elemente im Array via Funktion hinzugefügt/geändert werden. Die Werte sollen nicht "manuell" sortiert werden sondern unmittelbar nach einem neu eingefügten oder veränderten Eintrag.

Nun möchte ich, dass der mit den 10000 als erstes in der Liste steht. Doch dieser wird ans Ende gesetzt, sobald ich mit Liste.sort() dieses Array sortieren möchte.

Kann ich es irgendwie arrangieren, dass die Elemente ungefähr so sortiert werden?

  
Liste = new Array()  
Liste[0] = new Array("Name",10000)  
Liste[1] = new Array("Name",1000)  
Liste[2] = new Array("Name",100)  
Liste[3] = new Array("Name",10)  
Liste[4] = new Array("Name",0)  

Natürlich wird die Liste in die 100000 Einträge gehen. Daher weiß man nie, wie die Platzierungen (Rangliste für ein Online-Spiel basierend auf JavaScript (Prototyp) ) aussehen.

Für Hilfen, Tipps, Informationen wäre ich sehr dankbar.

MFG
Griever

  1. Hallo,

    Dabei möchte ich aber, dass das Array (Mehrdimensional) nach einem numerischen Wert sortiert wird.

    unter http://de.selfhtml.org/javascript/objekte/array.htm#sort gibt es ein Beispiel für eine numerische Sortierung. Das kannst Du doch auch für Deinen mehrdimensionalen Array verwenden.

    Ciao,
    Andreas

    --
    "Das Corporate Design für das Internet sieht eine Reihe von Grafikelementen vor, die die Optik der Webseite visuell und funktionell beeinflussen." - (Zitat aus dem "Styleguide Corporate Design"  eines großen Konzerns...)
  2. Hi,

    Gibt es ein Scriptbeispiel/Funktion/Prototype, mit dem man ein Array sortieren kann.

    guck mal hier < http://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_sort2> bzw. etwas umständlicher hier < http://www.mickweb.com/javascript/arrays/sortingArrays.html>

    MfG,
     Juan

  3. Hoi

    Dazu muss ich aber auch sagen, dass die Elemente im Array via Funktion hinzugefügt/geändert werden. Die Werte sollen nicht "manuell" sortiert werden sondern unmittelbar nach einem neu eingefügten oder veränderten Eintrag.

    Warum nimmst du dann nicht nen ganz anderen Ansatz ? Sortiere die Liste nicht NACH jedem Einfügen, sondern bohr deine Einfügen-Funktion auf, sodass die Sortierung gar nie erst durcheinander kommt.

    Dazu sollte die Einfügen-Funktion die richtige Position im Array suchen ( sehr schnell zu finden, da schon sortierte Liste - Stichwort Binary Search) und an dieser Stelle dann das Element einfügen. Ist meiner Meinung nach definitiv schneller, als nach jedem Einfügen die Liste neu zu sortieren.

    Also Funktion in etwa so:
    function insertRank(rank, ranking) {
       einfuegeindex = binarysearch(rank, ranking);
       newarray = ranking.lenght + 1;
       for(var i = 0; i<einfuegeindex; i++)
           newarray[i] = ranking[i];
       for( i = einfuegeindex+1; i<newarray.lenght; i++)
           newarray[i] = ranking[i];
       newarray[einfuegeindex] = rank;
       ranking = newarray;
    }

    Und wenn du einen Rank updaten willst, dann lösche denjenigen Eintrag aus der liste und füge ihn neu über obige Funktion wieder ein.

    Ist natürlich keine funktionsfähige Routine.

    Gruß Ben

    1. Oh. Danke.

      Doch irgendwie verstehe ich die Funktion nicht.

      Könntest du mir diese mal etwas näher erklären? Ich sehen nämlich nicht, wo es dort eine Abfrage für den Punktewert gibt.

      Mfg
      Griever

      1. Oh. Danke.

        Doch irgendwie verstehe ich die Funktion nicht.

        Könntest du mir diese mal etwas näher erklären? Ich sehen nämlich nicht, wo es dort eine Abfrage für den Punktewert gibt.

        Abfrage für den Punktewert musst du in BinarySearch einbauen.

        BinarySearch geht in etwa wie folgt:
        Nimm die Mitte eines Arrays und vergleiche den Wert an dieser Stelle mit dem einzufügenden Wert. Ist er größer, dann gehts mit dem Teil-Array vom Anfang bis zur Mitte weiter, ansonsten mit dem Teil-Array von der Mitte bis zum Ende. Bei diesem Teil-Array nimmst du wieder die Mitte und das ganze Spiel fängt von vorne an. Bis du entweder eine Stelle gefunden hast, an der der Wert übereinstimmt oder die Länge des TeilArrays nur noch eins ist. In beiden Fällen hast du die Indexposition, an der du den Eintrag einfügen musst. Und für den Rest nimmste dann die Funktion, die ich vorher gepostet hatte. Mußt sie natürlich noch anpassen, da das so ne Art Pseudo-JavaScript war :)

        Gruß Ben

        1. Ja. Danke.

          Sorry, dass du dir die Aufwendige Arbeit gemacht hast, mir das jetzt zu erklären. Habs auch gut verstanden. Doch mir hat jemand jetzt schon ein sehr (brauchte keine Erklärung) einfaches Script geboten. Es funktioniert genau so, wie es soll. Aber Haargenau.

          Aber danke.

          MFG
          Griever

          1. Hoi nochmal.

            Jo, die obige Funktion ist natürlich einfacher und wohl auch schneller. Sorry, ich wusste nicht, dass es sich bei den Arrays in JS eigentlich um Vectoren handelt, sprich mit dynamischer Erweiterung der Länge.

            Allerdings solltest du in die Funktion noch eine weitere Abfrage einbauen, denn was passiert, wenn 2 Leute den gleichen Highscore haben. Soll dann der zuletzt eingetragene als oberster angezeigt werden ?

            Gruß Ben

            1. Das mach ich schon. Das wird einfach ...

              MFG
              Griever

  4. Dazu muss ich aber auch sagen, dass die Elemente im Array via Funktion hinzugefügt/geändert werden. Die Werte sollen nicht "manuell" sortiert werden sondern unmittelbar nach einem neu eingefügten oder veränderten Eintrag.

    Dann bietet sich an, eine eigene add() Funktion zu erstellen, z.b. so:

      
    Array.prototype.add = function(name, wert)  
    {  
       var i = 0;  
       while( this[i] && wert < this[i][1] ) { i++; }  
       for(var j = this.length ; j > i; j--)  
       {  
           this[j] = this[j-1];  
       }  
       this[i] = [name, wert];  
    }  
    var Liste = new Array();  
    Liste.add("Name",1000);  
    Liste.add("Name",100);  
    Liste.add("Name",10000);  
    Liste.add("Name",0);  
    Liste.add("Name",10);  
      
    alert(Liste.join('\n'));  
    
    

    Struppi.

    1. Hey. Das ist gut.

      Denkt zwar um ne Ecke. Aber das ist genau das, wonach ich gesucht habe. Einfach zu verstehen und schnell im System.

      Danke.

      MFG
      Griever