2012-09-28 15 views
5

Ich brauche die Saiten einer LinkedList durch die Länge des Strings zu sortieren, möchte aber die Reihenfolge der gleichen Länge Strings halten (nicht lexikographisch sortiert).Wie wird LinkedList <String> sortiert?

Probeneingang:

this 
is 
just 
a 
test 

Beispielausgabe:

a 
is 
this 
just 
test 

Ich versuche, dies mit einer Comparable<LinkedList<String>> und einem compareTo Methode zu tun, aber ich nicht bekommen, die richtige Ausgabe (mein noch sortiert es lexikographisch)

public class Q3_sorting implements Comparable<LinkedList<String>> { 
    Scanner keyboardScanner = null; 
    LinkedList<String> fileList = new LinkedList<String>(); 

// [...] etwas Code hier

public int compareTo(LinkedList<String> o) { 
     // TODO Auto-generated method stub 
     o = fileList; 

     for (int i = 0; i < fileList.size() -1; i++) { 
      if (fileList.get(i).length() == o.get(i+1).length()) { 
       return 0; 
      } 
      if (fileList.get(i).length() > o.get(i+1).length()) { 
       return -1; 
      } 
      if (fileList.get(i).length() < o.get(i+1).length()) { 
       return 1; 
      } 

     } 

ich dann
Q3_sorting sort = new Q3_sorting(args);
Collections.sort(sort.fileList); in meinem Haupt-Methode. Ich drucke dann die Liste aus ...

aber ich habe dies als Ausgabe:

a 
is 
just 
test 
this 

Wie kann ich dieses Problem beheben? leider

Antwort

3

Sie Strings werden Sortierung, keine Listen von Strings.Um dies zu tun, müssen Sie eine Comparator<String> definieren zwei Strings durch ihre Länge zu vergleichen, wie folgt:

public class ByLength implements Comparator<String> { 
    @Override 
    public int compare(String a, String b) { 
    return a.length() - b.length(); 
    } 
} 

Dann die Liste zu sortieren, müssen Sie rufen:

Collections.sort(sort.fileList, new ByLength()); 

Beachten Sie auch, dass die Sortierung a LinkedList ist sehr ineffizient und Sie sollten stattdessen eine ArrayList verwenden.

+0

Jede sinnvolle Implementierung von 'Collections.sort' wird die Daten vor dem Sortieren in ein Array kopieren und dann wieder hineinkopieren.' LinkedList' ist jedoch im Allgemeinen ineffizient und sollte normalerweise vermieden werden. –

-1

Strings haben keine Eigenschaft, die bedeutet, welche Position sie in einer verknüpften Liste halten. Sie müssen daher ein benutzerdefiniertes Datenobjekt erstellen, das diese Informationen verfolgt. Entweder das oder schreiben Sie Ihre eigene benutzerdefinierte Sortiermethode für die verknüpfte Liste und rufen Sie diese anstelle von Collections.sort() auf.

6

über die Collections.sort(list, comparator) Überlastung. Sie benötigen eine Comparator<String> keine Comparator<LinkedList<String>>. Beachten Sie, dass das Javadoc von Collections.sort eine stabile Sortierung garantiert (behalten Sie die Reihenfolge gleicher Strings bei, gleiches Mittel gleich nach Komparator).

+0

Ah, ok. Wie dumm von mir ... Danke – user1706571

7

Sie einen Komparator schaffen sollte:

public class Q3_sorting implements Comparator<String> { 
public int compare(String a, String b) { 
return a.length() - b.length(); 
} 

Und dann sortieren sie mit der Methode:

Collections.sort(list, new Q3_sorting()); 

Beachten Sie, dass Sie wollen, welche Art zu tun ist, die Strings in der Liste. Durch die Implementierung eines Vergleichers von List (oder eines vergleichbaren, da zu demselben Zweck hier funktioniert), was Sie der JVM sagen, ist, dass Sie verschiedene Listen vergleichen wollen.

Sie können auch Ihr Ziel erreichen, indem eine vergleichbare in der Klasse der Umsetzung zu sortieren, aber man kann nicht so lange wie String endgültig ist, so können Sie nicht erweitern. Deshalb gibt es keine andere Möglichkeit, als einen Komparator zu implementieren, die auch einfacher :)

+0

Der 'Comparator' kann auch außerhalb der' List' Implementierungen verwendet werden, zB für 'TreeSet' und' TreeMap'. – Brian

+0

Ja. Es kann auch verwendet werden, um Arrays über die Dienstprogrammklasse Arrays unter benutzerdefinierten Verwendungen zu sortieren. – enTropy

Verwandte Themen