Sortieren einer Liste

Status
Nicht offen für weitere Antworten.

bambi

Bekanntes Mitglied
Also mein Problem:
ich moechte eine Liste sortieren. In der Liste stehen Strings - eigentlich sind's Mitarbeiter-Nummern.

So. Und nu kommts. :!:
Nein, ich moechte das nicht nach den Mitarbeiter-Nummern sortiereen, sondern:
Zu jeder Nummer gibt es einen Eintrag in einer HashMap. Der Key ist die Mitarbeiter-Nummer (die als String gespeichert
wird). Das Objekt ist eine JavaBean, die Vorname, Nachname usw. enthaelt. Die Liste soll nun so sortiert werden, dass
zB. "Arno Arnensen" mit der Nummer 345 vor "Zenti Zensen" mit der Nummer 123 in der Liste steht.

Und das Wichtigste dabei: es muss fix sein. In der HashMap stehen ca. 8000 Personen. Fuer jede Person
gibt es diese Liste - es muessen also ca 8000 Listen sortiert werden...

Hat jemand 'ne prickelnde Idee? 8)
 
Mein Vorschlag: Mit Collections.sort hättest du einen O( n log n ) - Algorithmus (für solche Sachen wohl das Schnellste), und mit einem Comparator kannst du eine beliebige Reihenfolge festlegen (du musst nur 2 Objekte vergleichen können).
Mit einem Collator kannst du auch die Strings einfach vergleichen (und das erst noch automatisch nach den Einstellungen die der Benutzer gemacht hat)
 
Also erst mal DANKE fuer Deine schnelle Antwort.
Ich muss gestehen, dass ich mit dem Comparator bisher noch nicht gearbeitet habe, aber das hier hab' ich jetzt
mal geschrieben:
Code:
public class PersonProxy extends java.lang.Object implements Serializable 
{    
    private String firstName = null;
    private String lastName = null;
    private String employeeNum = null;

    /** ... andere Felder ...*/
    
    /** ... Getter und Setter ...*/

    public int compare(Object obj1,Object obj2){
        int result = 0;
       
       PersonProxy p1 = (PersonProxy) obj1;
       PersonProxy p2 = (PersonProxy) obj2;
       
       String lname1 = p1.getLastName();
       String lname2 = p2.getLastName();
       
       // wenn Nachnamen gleich, dann nach Vornamen sortieren
       result = lname1.compareTo(lname2);
       if(result == 0){

           String fname1 = p1.getFirstName();
           String fname2 = p2.getFirstName();

           result = fname1.compareTo(fname2);
       }
       return result;
    }
...

Hoffe mal, dass das jetzt so halbwegs richtig ist. Wie kann ich das denn jetzt mit meiner Collections
verwenden? Irgendwie bekomm ich's net hin... :bahnhof:
 
fast richtig 🙂

1. du musst nicht explizit von Object erben... das ist automatisch
2. eine Möglichkeit wäre, dass deine Klasse das Interface Comparable implementiert. Das hat die Methode compareTo, dass dir die totale Ordnung über deinen Objekten gibt.
3. du schreibst dir eine Comparator Klasse die hat die Methode compare , die dir auch die totale Ordnung definiert, aber unabhängig von der Klasse ist...

3. hat den vorteil wenn du unterschiedl. Sortieren willst je nach Situation. 2. würde ich nehmen, wenn das Sortieren immer das gleiche ist
 
Hier eine Variante mit 'Comparable'

Diene Klasse:
Code:
public class PersonProxy implements Comparable, Serializable {

  private String firstName;
  private String lastName;
  private String employeeNum;

  /** ... andere Felder ...*/
   
  /** ... Getter und Setter ...*/


  public int compareTo(Object obj) {
    if (!(obj instanceof PersonProxy)) {
      //hier was tun, ClassCastException wird sowieso gewofen...
      throw new ClassCastException();
    }
    
    PersonProxy pp = (PersonProxy) obj;

    //Kurzschreibform, StringBuffer besser!
    String s1 = lastName + firstName + employeeNum;
    String s2 = pp.getLastName() + pp.getFirstName() + pp.getEmployeeNum();

    return (s1.compareTo(s2));
  }

  public String toString() {
    //Kurzschreibform, StringBuffer besser!
    String str = firstName + " " + lastName + " mit seinem 'employeeNum' " + employeeNum;
    return str;
  }
}


Dann irgendwo machst Du sowas:
Code:
SortedSet s = new TreeSet(deinHashMap.values());

Wie deathbyaclown schon sagte, wenn Sortierungskriterien flexibel halten willst,
Comparator schreiben.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben