Objekte in einer Hashtable am einfachsten sortieren

  • Themenstarter Themenstarter hanserl
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
H

hanserl

Gast
Hallo zusammen,

ich hab ein Problem mit einer Hashtable und den Objekten die darin gespeichert sind.

Die Hashtable sieht so aus.
htStudentContainer = (String ID, Student oStudent)

Jeder Student ist in einem bestimmten Semester --> Bsp: Student.m_szSemester

Nun soll die Ausgabe aller Studenten nach Semester sortiert ausgegeben werden.

Die Frage is nun wie kann ich die Studenten in der Hashtable so sortieren dass sie bei der Ausgabe nach Semester ausgegeben werden.

Hoffe jemand weiss Rat.

Vielen Dank und Grüsse
 
eine hashtable an sich kannst du nicht sortieren (wenn ich mich nicht täusche)

wenn du die daten sortieren musst, empfehle ich dir z.b. eine ArrayList. dies bedeutet dann aber, dass du die id ebenfalls in der Student-klasse speichern musst.
zusätzlich kannst du im Student das Comparable-interface implementieren. (google hilft da gerne weiter)
anschliessend kannst du mit Collections.sort(List) deine liste sortieren.

<edit>
hm, da warst du wohl schneller 😉
das mit dem entryset hab ich nicht gewusst... in dem fall doch keine arraylist :bae:
</edit>
 
ein kleines Beispiel

Code:
Collections.sort(hashtable.keySet(), new Comparator<Student>(){
public int compare(Student s1 , Student s2){
//.....compare
}
});
 
yep

dann über das set iterieren....pronto

EDIT:
das Set sollte nat. nicht so benutzt werden..
sondern Set ks = hs.keySet()....
 
Danke für die schnellen Antworten erstmal.

Also die ID auch direkt im Student - Objekt zu speichern ist kein Problem.
Das werd ich dann erstmal machen.


Wenn ich den müden Joe richtig verstehe dann kann man in die Hashtable nach den keys sortieren.
Das würde ja heissen dass die Sortierung unter Umständen ja auch mit Hashtable geht.

Egal...
Auf jeden Fall werd ichs mit der ArrayList versuchen - oder doch nicht?
Ich suche nach der elegantesten Lösung...

Danke und Grüsse
 
Wenn Du eine Hashtable mit sortierten Schuesseln willst, kannst Du einfach eine TreeMap verwenden.
Wenn die Sortierung von den values abhaengt, musst du wohl oder uebel immmer die values() Collection der Map in eine Liste packen und sortieren.
 
Code:
Set ks = hs.keySet();

Collections.sort( /*siehe oben*/);

//iterier über Set mit geordneten IDs
Student s = ht.get(ks.next());

Die Hashtable ist nicht geordnet, aber die keys.
anhand der geordneten Keys kommst du auch an die Studis
 
ich persönlich habe solche sachen bis anhin mit ArrayLists gelöst. der nachteil dort ist halt, dass wenn man anhand eines schlüssels auf ein element zugreifen will, per for-schleife alles abgrasen muss, bis der entsprechende eintrag gefunden wurde.

die variante vom müden joe habe ich bis jetzt nicht gekannt. wird bei der nächsten gelegenheit sowas mal ausprobieren.

welche variante ist eleganter? kA 😉 muss schlussendlich jeder für sich entscheiden denk' ich. "meine" variante per arraylist wird jenachdem einfach recht langsam bei steigenden datenbeständen schätz' ich mal
 
Collections.sort() geht nur mit Listen nicht mit Sets.

Code:
List<Student> studenten = new ArrayList(map.values());
Collections.sort(studenten, new Comparator() {
public int compare(Student o1, Student o2)
{
    return o2.m_szSemester - o1.m_szSemester;
}
});
 
ueberseht nicht den Beitrag von Gast... einfach eine TreeMap nutzen wenn es per default sortiert werden soll !
 
Danke für eure Hilfe.

Das Problem habe ich folgendermassen gelöst.
Funktioniert wunderbar....


Code:
//sortiere die Liste  mit dem Studenten (htIndisUnsorted) nach Generation
    List<Student> al_Students = new ArrayList( htIndisUnsorted.values() ); //nur ht auf List - sort geht nicht über ht
    Collections.sort( al_Students, new Comparator<Student>()
    {
      public int compare( Student indi_1, Student indi_2 )
      {
        int i1_generation = Integer.parseInt(indi_1.getM_szGeneration());
        int i2_generation = Integer.parseInt(indi_2.getM_szGeneration());   
        
        if (i1_generation < i2_generation) 
        {
          return -1;
        }
        if (i1_generation > i2_generation) 
        {
          return 1;
        }        
        return 0; //values sind gleich
      }
    } );


 System.out.println("--------------------------------- Sorted Indiviudals -------------------------------");
    for (int x = 0; x < al_Students .size(); x++)
    {
      Individual i = al_Individuals.get(x);
      System.out.println( "Generation: " + i.getM_szGeneration() );
    }
 
liste geht natuerlich auch, nur damit verlierst du den direkten zugriff auf ein element anhand eines eindeutigen schluessels....
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben