2012-09-28 11 views
5

Ho bisogno di ordinare le stringhe di una lista collegata per la lunghezza delle stringhe, ma vorrei mantenere l'ordine delle stringhe della stessa lunghezza (non ordinate lessicograficamente).Come ordinare LinkedList <String>?

ingresso

Esempio:

this 
is 
just 
a 
test 

Output di esempio:

a 
is 
this 
just 
test 

che sto cercando di fare questo con un metodo Comparable<LinkedList<String>> e un compareTo, ma non ho ricevuto l'uscita corretta (la mia ancora lessicograficamente)

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

// [...] qualche codice qui

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; 
      } 

     } 

Ho quindi utilizzare
Q3_sorting sort = new Q3_sorting(args);
Collections.sort(sort.fileList); nel mio metodo principale. Ho poi stampare l'elenco fuori ...

ma ottengo questo come output:

a 
is 
just 
test 
this 

Come dovrei rimediare a questo problema?

risposta

3

Si stanno ordinando stringhe, non liste di stringhe.Per fare questo, è necessario definire un Comparator<String> per confrontare due stringhe per la loro lunghezza come segue:

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

Poi, per ordinare l'elenco, è necessario chiamare:

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

Si noti inoltre che l'ordinamento a LinkedList è molto inefficiente e si dovrebbe usare invece un ArrayList.

+0

Qualsiasi implementazione ragionevole di 'Collections.sort' copierà i dati in un array prima di ordinare, e quindi copierà di nuovo. Tuttavia,' LinkedList' è generalmente inefficiente e di solito dovrebbe essere evitato. –

-1

Le stringhe purtroppo non hanno una proprietà che indica quale posizione tengono in un elenco collegato. Sarà quindi necessario creare un oggetto dati personalizzato che tenga traccia di tali informazioni. Oppure scrivi il tuo metodo di ordinamento personalizzato per l'elenco collegato e chiama invece di Collections.sort().

6

Utilizzare il sovraccarico Collections.sort(list, comparator). È necessario un Comparator<String> non uno Comparator<LinkedList<String>>. Si noti che javadoc di Collections.sort garantisce un ordinamento stabile (mantenere l'ordine di stringhe uguali, uguale alla media uguale secondo il proprio comparatore).

+0

Ah, ok. Quanto stupido da parte mia ... Grazie – user1706571

7

È necessario creare un comparatore di prezzi:

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

E poi sorta con il metodo:

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

Nota che ciò che si vuole fare è sorta la stringhe all'interno della lista. Implementando un comparatore di List (o un programma comparabile, poiché funziona allo stesso scopo qui), quello che stai dicendo alla JVM è che vuoi confrontare i diversi List.

Si potrebbe anche raggiungere il proprio obiettivo implementando un Comparable nella classe per l'ordinamento, ma non è possibile fintanto che String è final, quindi non è possibile estenderlo. Pertanto non c'è altro modo che implementare un comparatore, che è anche più semplice :)

+0

Il 'Comparator' può anche essere usato fuori dalla lista delle implementazioni di' List', come per 'TreeSet' e' TreeMap'. – Brian

+0

Sì. Può anche essere usato per ordinare gli array, attraverso la classe di utility Arrays, tra gli usi personalizzati. – enTropy