Supportnet Computer
Planet of Tech

Supportnet / Forum / Anwendungen(Java,C++...)

Java: LinkedList alphabetisch sortieren





Frage

Hallo! Ich habe eine LinkedList "list" mit Wörtern gefüllt und diese mit Collections.sort(list); alphabetisch sortiert. Das Ergebnis ist aber leider nicht so, wie ich es mir gewünscht habe: sortiert wird hier nach ASCII Zeichensatz und da kommen ja bekanntlich die Kleinbuchstaben nach den großen... Was ich möchte ist eine Liste die etwa so aussieht: Aal Alles auch Bad Blau blau ... Gibt's da auch eine fertige Methode oder muss ich die selbst schreiben?!?

Antwort 1 von semi

Gibts nicht. Selbst ist der Mann. :P

Antwort 2 von Xavier

Du hast aber nicht zufällig eine Methode, die du hier posten könntest, oder?
Ein Ansatz wäre auch schon hilfreich...

Antwort 3 von mr_x_hacker

Also das Problem betrifft nur den ersten Buchstaben, oder?

Dann könntest Du folgendes machen:
- Erstelle 26 Listen [O(1)]
- Durchlaufe die bestehende Liste, werte den ersten Buchstaben aus (charAt(0).toLowerCase()) und schreib das Wort dann in die entsprechende Liste von den 26 (a..z) [O(n)]
- Sortiere die 26 Listen [O(n*log(n))]
- Setze sie wieder zusammen :-) [O(n)]

Kostet insgesamt also auch nur 1+n+n*log(n)+n = n*log(n) wie das normale Sortieren, und sollte das liefern was Du oben wolltest, da bei den 26 kleinen ja die Kleinbuchstaben nach den Großen stehen...

Vermutlich wird Semi aber demnächst 'ne perfekt lauffähige Lösung liefern ;-)


Ciao Sascha



Antwort 4 von semi

Es reicht den Comparator zu implementieren (vergleich zweier Zeichenketten)

class MyComparator implements Comparator
{
  public int compare(Object a, Object b)
  {
    String s1 = (String)a;
    String s2 = (String)b;
    int ml = Math.min(s1.length(),s2.length());
    for(int i=0; i<ml; i++)
    {
      char c1 = s1.charAt(i);
      char c2 = s2.charAt(i);
      int r = Character.toUpperCase(c1)-Character.toUpperCase(c2);
      if(r!=0)
        return r;
      boolean c1u = Character.isUpperCase(c1);
      boolean c2u = Character.isUpperCase(c2);
      if(c1u!=c2u)
        return (c1u)?-1:1; // Hier vertauschen, für Kleinbuchstaben zuerst
    }
    return s1.length()-s2.length(); // Kürzere zuerst
  }
}
Den Comparator kannst Du als zweiten Parameter an Collection.sort übergeben.
Man kann's besser machen, wenn man die komplette Sortierung neu implementiert. Lohnt sich aber nur, wenn Du zig Tausend Begriffe sortierst.

@mr_x_hacker
Schleimer :)

Gruß,
Michael

Antwort 5 von TinyBaby

Das Ganze geht noch einfacher, weiß nicht ob es das früher noch nicht gab, aber da ich heute mit dem selben Problem zu tun hatte, wollte ich es einfach mal loswerden:
http://java.sun.com/j2se/1.5.0/docs/api/java/text/Collator.html
Mit dem Collator kann man auf sehr differenzierte Weise Strings vergleichen,
bspw:
Hier ein Collator der Strings in deutscher Schreibweise vergleicht:

Collator deCollator = Collator.getInstance(Locale.GERMAN);
deCollator.setStrength(Collator.PRIMARY);
//Beispiel für die Benutzung:
if( usCollator.compare("abc", "ABC") == 0 ) {
System.out.println("Strings are equivalent");
}
PRIMARY gibt hierbei an, wie stark beim Vergleichen auf Kleinigkeiten geachtet werden soll. Alles nachzulesen auf der oben angebenen Seite.
Meine Antwort kommt zwar ein paar Jahre zu spät :)
aber vielleicht kommt ja einer durch Googlen auch auf diese Page und freut sich über meine Antwort :)

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: