Según el acuerdo, cuando utilice la programación Java, debe utilizar las bibliotecas de clases existentes tanto como sea posible. Por supuesto, también puede escribir un método o marco de clasificación usted mismo, pero ¿cuántas personas pueden escribir mejor que las del JDK? Otro beneficio de usar clases existentes es que el código es fácil de leer y mantener. Este artículo habla principalmente sobre cómo usar bibliotecas de clases existentes para ordenar matrices y varios contenedores de colección (algunos ejemplos en el artículo provienen de "Java Developers Almanac 1.4". )
En primer lugar, necesita conocer dos clases: java.util.Arrays y java.util.Collections (tenga en cuenta la diferencia con Collection). Collection es la interfaz de nivel superior del marco de la colección, y Collections contiene muchos métodos estáticos. Usamos Arrays para ordenar matrices y Collections para ordenar contenedores de marcos combinados, como ArraysList, LinkedList, etc.
Se debe agregar java.util.* y otros códigos de shell, como clases y métodos principales estáticos, a los ejemplos. Escribiré todos los códigos en el primer ejemplo y los omitiré sin excepción en el siguiente.
ordenar matriz
Por ejemplo, hay una serie de números enteros:
Copie el código de código de la siguiente manera:
int[] intArray = nuevo int[] {4, 1, 3, -23};
¿Cómo lo ordenamos? ¿Estás pensando en el algoritmo de clasificación rápida en este momento? Echa un vistazo a cómo se hace esto:
Copie el código de código de la siguiente manera:
importar java.util.*;
Clase pública Ordenar {
principal vacío estático público (String [] argumentos) {
int[] intArray = nuevo int[] {4, 1, 3, -23};
Arrays.sort(intArray);
}
}
De esta manera, usamos el método estático sort() de Arrays para ordenar el intArray en orden ascendente, y ahora la matriz se ha convertido en {-23,1,3,4}.
Si es una matriz de caracteres:
Copie el código de código de la siguiente manera:
String[] strArray = new String[] {"z", "a", "C"};
Usamos:
Copie el código de código de la siguiente manera:
Arrays.sort(strArray);
El resultado después de ordenar es {C, a, z}, y sort() ordenará en orden ascendente según el orden natural de los elementos. Si desea no distinguir entre mayúsculas y minúsculas, puede escribir:
Copie el código de código de la siguiente manera:
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
Por supuesto, también podemos especificar una determinada sección de la matriz para ordenar. Por ejemplo, si queremos ordenar las partes 0-2 de la matriz (asumiendo que la longitud de la matriz es mayor que 3) y las otras partes permanecen sin cambios, puede utilizar:
Copie el código de código de la siguiente manera:
Arrays.sort(strArray,0,2);
De esta forma, solo ordenamos los primeros tres elementos sin afectar las siguientes partes.
Por supuesto, algunas personas pensarán, ¿cómo puedo ordenar en orden descendente? Entre los muchos métodos de clasificación, una copia del código es la siguiente:
ordenar(T[] a, Comparador<? super T> c)
Podemos usar Comparator para obtener un comparador en orden inverso. Comparator se explicará más adelante. Tome el intArray [] anterior como ejemplo:
Copie el código de código de la siguiente manera:
Arrays.sort(intArray,Comparator.reverseOrder());
De esta forma, el resultado que obtenemos es {4,3,1,-23}. Si no queremos modificar el código original también podemos usar:
Copie el código de código de la siguiente manera:
Colecciones.reverse(Arrays.asList(intArray));
Obtenga el orden inverso de la matriz. El resultado también es 4,3,1,-23}.
Ahora la situación ha cambiado. Nuestra matriz ya no es una matriz de tipo de datos primitivo (tipo primitivo) o tipo Cadena, sino una matriz de objetos. Se desconoce el orden natural de esta matriz, por lo que necesitamos implementar la interfaz Comparable para esta clase. Por ejemplo, tenemos una clase Nombre:
Copie el código de código de la siguiente manera:
Nombre de clase implementa Comparable<Nombre>{
cadena pública nombre, apellido;
Nombre público (cadena nombre, cadena apellido) {
this.firstName=firstName;
this.lastName=apellido;
}
public int compareTo(Name o) { //Implementar la interfaz
int lastCmp=apellido.compareTo(o.apellido);
return (lastCmp!=0?lastCmp:firstName.compareTo(o.firstName));
}
public String toString(){ //Conveniente para pruebas de salida
devolver nombre+" "+apellido;
}
}
De esta manera, cuando ordenamos esta matriz de objetos, primero compararemos apellido, luego compararemos nombre y luego obtendremos el orden de los dos objetos, tal como se implementa en compareTo (Nombre o). También puedes probarlo con el programa:
Copie el código de código de la siguiente manera:
importar java.util.*;
clase pública Ordenación de nombres {
público estático vacío principal (String [] argumentos) {
Nombre nombreArray[] = {
nuevo nombre("John", "Lennon"),
nuevo nombre("Karl", "Marx"),
nuevo nombre("Groucho", "Marx"),
nuevo nombre("Oscar", "Gruñón")
};
Arrays.sort(nombreArray);
for(int i=0;i<nombreArray.length;i++){
System.out.println(nameArray[i].toString());
}
}
}
El resultado es el que esperábamos:
Copie el código de código de la siguiente manera:
Óscar Gruñón
John Lennon
Groucho Marx
Carlos Marx
Ordenar marcos de colección
Si ha entendido Arrays.sort() para ordenar matrices, el uso del marco de colección es similar. Simplemente reemplace Arrays con Collections. Tenga en cuenta que Collections es una clase y Collection es una interfaz. Aunque solo hay una "s" de diferencia, sus significados son completamente diferentes.
Supongamos que existe una lista vinculada de este tipo:
Copie el código de código de la siguiente manera:
lista LinkedList=nueva LinkedList();
lista.add(4);
lista.add(34);
lista.add(22);
lista.add(2);
Sólo necesitamos usar:
Copie el código de código de la siguiente manera:
Colecciones.sort(lista);
Puede ordenar los elementos en ll de pequeño a grande y el resultado será:
Copie el código de código de la siguiente manera:
[2, 4, 22, 34]
Si los elementos de LinkedList son cadenas, también se ordenarán de pequeño a grande como los tipos de datos básicos.
Si desea implementar la clasificación inversa, es decir, desde la clasificación hasta la clasificación pequeña:
Copie el código de código de la siguiente manera:
Colecciones.sort(lista,Collectons.reverseOrder());
Si los elementos en LinkedList son objetos personalizados, puede implementar la interfaz Comparable como el objeto Nombre anterior y luego dejar que Collection.sort() los ordene por usted.
Si desea ordenar un objeto según sus propias ideas, puede utilizar el código copiado de la siguiente manera:
ordenar (Lista <T> lista, Comparador <? super T> c)
Este método realiza la clasificación. Antes de dar un ejemplo, primero debemos explicar el uso de Comparator y el formato de la interfaz Comparable:
Copie el código de código de la siguiente manera:
Comparador de interfaz pública<T> {
int comparar(T o1, T o2);
}
De hecho, el método de escritura de int compare(T o1,T o2) en Comparator es similar al método de escritura del método compareTo() en Comparable. En la clase de Nombre anterior, nuestra comparación comienza desde Apellido. Este es el hábito de los occidentales. En este momento, queremos comenzar la comparación desde primer Nombre sin modificar el código original.
Copie el código de código de la siguiente manera:
Comparador final<Nombre> FIRST_NAME_ORDER=nuevo Comparador<Nombre>() {
public int comparar(Nombre n1, Nombre n2) {
int firstCmp=n1.firstName.compareTo(n2.firstName);
retorno (firstCmp!=0?firstCmp:n1.apellido.compareTo
(n2.primerNombre));
}
};
De esta forma se escribe nuestro Comparador personalizado FIRST_NAME_ORDER.
Convierta la matriz de nombres del ejemplo anterior en una Lista:
Copie el código de código de la siguiente manera:
Lista<Nombre> lista=Arrays.asList(nombreArray);
Colecciones.sort(lista,FIRST_NAME_ORDER);
De esta manera, configuramos con éxito la clasificación utilizando nuestro propio comparador definido.