2012-03-09 17 views
5

Para las matrices existe una función especial para la clasificación de una parte de la matriz a partir de un índice a otro:Java: Ordenar la lista de índice a otro

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

Para List< T>

también hay una función para clasificar

Collections.sort(List<T> list)

Desafortunadamente no hay ninguna variante de aceptar un fromI ndex y toIndex parámetro.

Yo sé que podría resolver este problema, ya sea aplicando

  • Convertir la lista en una matriz y aplicar Arrays.sort, a continuación, volver a convertirlo en una lista
  • Copia de las entradas de la lista indexados por fromIndex a toIndex a una nueva lista (utilizando list.subList(fromIndex, toIndex)), que tipo y sobrescribir la lista de entradas antiguas

Pero espero que hay una forma más bonita de hacer eso.

+1

Hey man, no hay vergüenza en la conversión a una matriz, disfrutando de unas pocas funciones adicionales entonces la conversión posterior;) –

Respuesta

10

Simplemente use .subList() para obtener una vista "respaldada" en la lista principal, luego llame a ordenar. La sublista es "escritura", por lo que los cambios se reflejan en el original.

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

salida

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

1, que lo hizo parecer tan simple :-) –

2

Puede utilizar subList() en su lista original, a continuación, ordenar la lista secundaria y que se reflejará en su lista original sin tener que escribir de nuevo.

1

En cuanto a la documentación de Oracle, Collections y List simplemente no contienen esta funcionalidad, como Arrays hacer. Si tuviera que elegir entre sus dos sugerencias, implementaría la segunda, usando el List.subList(fromIndex, toIndex)).

Aquí está la documentación: 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 de las entradas de la lista indexados por fromIndex a toIndex a una nueva lista de (mediante el uso de list.subList (fromIndex, toIndex)), una especie que y sobrescribe las entradas de la lista anterior

No, no hay copia de objeto cuando llama a list.subList. La función subList crea una vista respaldada por la lista original. Solo copias de referencia; no hay copias de objetos reales

Cualquier operación (clasificación) en la vista se reflejará en la lista original.

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)); 
    } 
Cuestiones relacionadas