2012-03-09 12 views
5

Per gli array esiste una funzione speciale per classificare una parte della matrice dall'indice all'indice:Java: sorta Elenco dall'indice all'indice

Arrays.sort(Object[] a, int fromIndex, int toIndex)

Per List< T>

c'è anche una funzione per l'ordinamento

Collections.sort(List<T> list)

Purtroppo non v'è alcuna variante accettare un fromI parametro ndex e toIndex.

so che ho potuto risolvere questo problema sia applicando

  • convertire l'elenco in un array e applicare Arrays.sort, poi riconvertirlo in un elenco
  • Copia le voci dell'elenco indicizzate da fromIndex a toIndex a un nuovo elenco (utilizzando list.subList(fromIndex, toIndex)), ordinare e sovrascrivere la vecchia lista voci

ma spero che ci sia un modo più bello per farlo.

+1

Hey man, non c'è vergogna nel convertire a un array, godendo di alcune funzioni extra quindi riconversione;) –

risposta

10

Basta usare .subList() per ottenere una vista "backed" sull'elenco principale, quindi chiamare sort. La sottolista è "write-through", quindi i cambiamenti si riflettono nell'originale.

List<Integer> foo = Arrays.asList(5,3,1,6,2,1); 
Collections.sort(foo.subList(0, 3)); // sort first 3 elements 
System.out.println(foo); 
Collections.sort(foo.subList(3, 6)); // sort last 3 elements 
System.out.println(foo); 

uscita

[1, 3, 5, 6, 2, 1] 
[1, 3, 5, 1, 2, 6] 
+0

+1, hai fatto sembrare così semplice :-) –

2

È possibile utilizzare subList() sulla vostra lista originale, quindi ordinare la sottolista e si rifletterà sulla vostra lista originale senza dover scrivere di nuovo.

1

Guardando la documentazione Oracle, Collections e List semplicemente non contengono questa funzionalità, come il Arrays do. Se dovessi scegliere tra i tuoi due suggerimenti, implementerei il secondo, usando lo List.subList(fromIndex, toIndex)).

Ecco i documenti: http://docs.oracle.com/javase/7/docs/api/java/util/List.html
http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html
http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html

2

Copia le voci dell'elenco indicizzati da fromIndex ad toIndex a un nuovo elenco (utilizzando list.subList (fromIndex, toIndex)), ordinarla e sovrascrivere le voci della vecchia lista

No, non è presente alcuna copia di oggetto quando si chiama list.subList. La funzione lista secondaria crea una vista con la lista originale. Solo copie di riferimento; nessuna copia di oggetti reali.

Qualsiasi operazione (ordinamento) sulla vista si rifletterà nell'elenco originale.

public static void main(String[] args) throws Exception { 
    List<Integer> list = Arrays.asList(1, 9, 8 ,7, 2, 3, 4); 

    // [9, 8 ,7] => [7, 8, 9] 
    sortList(list, 1, 4); 

    System.out.println(list);  // [1, 7, 8, 9, 2, 3, 4] 
    } 

    public static <T extends Comparable<T>> void sortList(
     List<T> list, int fromIndex, int toIndex) { 
    Collections.sort(list.subList(fromIndex, toIndex)); 
    }