2016-03-03 15 views
8

Come si ordina un elenco di elenchi in Java in ordine lessicografico utilizzando Collections.sort() o un altro metodo di ordinamento?Elenco liste di ordinazioni Java

private List<List<Integer>> possiblePoles = setPoles();  
System.out.println(possiblePoles) 
[[1, 3, 5], [1, 2, 3]] 
+0

Con l'implementazione di sorta da soli? – MikeCAT

+0

No, potrebbe essere una funzione Java. – Nic

+0

http://stackoverflow.com/questions/2999129/how-do-i-sort-an-arraylist-lexicographically – developer033

risposta

9

Si dovrà implementare la propria Comparator di classe e passa in un'istanza di Collections.sort()

class ListComparator<T extends Comparable<T>> implements Comparator<List<T>> { 

    @Override 
    public int compare(List<T> o1, List<T> o2) { 
    for (int i = 0; i < Math.min(o1.size(), o2.size()); i++) { 
     int c = o1.get(i).compareTo(o2.get(i)); 
     if (c != 0) { 
     return c; 
     } 
    } 
    return Integer.compare(o1.size(), o2.size()); 
    } 

} 

Poi l'ordinamento è facile

List<List<Integer>> listOfLists = ...; 

Collections.sort(listOfLists, new ListComparator<>()); 
+0

Ancora meglio: poiché Java utilizza la cancellazione dei tipi, è possibile creare un'istanza singleton di ListComparator e eseguire cast non sicuri (è comunque apolide). – Nayuki

+0

@Nayuki, preferisco non farlo perché non voglio portare in giro l'istanza per sempre, solo perché l'ho usato una volta. L'impronta di memoria potrebbe essere piccola, ma lo è anche il costo per la creazione di un oggetto. Ma tutti possono fare quello che vogliono ^^ – MartinS

+0

Io userei 'int c = ObjectUtils.compare (o1.get (i), o2.get (i))'. Altrimenti si ottiene un NPE se 'o1.get (i) == null'. ('ObjectUtils' è dalla libreria di apache commons) –