Leí acerca de cómo ordenar ArrayLists usando un comparador, pero en todos los ejemplos que la gente usa, compareTo
que según algunas investigaciones es un método para Strings.
Quería ordenar una ArrayList de objetos personalizados por una de sus propiedades: un objeto Date ( getStartDay()
). Normalmente los comparo, item1.getStartDate().before(item2.getStartDate())
así que me preguntaba si podría escribir algo como:
public class CustomComparator {
public boolean compare(Object object1, Object object2) {
return object1.getStartDate().before(object2.getStartDate());
}
}
public class RandomName {
...
Collections.sort(Database.arrayList, new CustomComparator);
...
}
java
sorting
date
comparator
Samuel
fuente
fuente
Respuestas:
Desde
Date
implementosComparable
, tiene uncompareTo
método al igual que loString
hace.Entonces su costumbre
Comparator
podría verse así:El
compare()
método debe devolver unint
, por lo que no podría devolver directamente unboolean
como estaba planeando.Su código de clasificación sería casi como lo escribió:
Una forma un poco más corta de escribir todo esto, si no necesita reutilizar su comparador, es escribirlo como una clase anónima en línea:
Ya que java-8
Ahora puede escribir el último ejemplo en una forma más corta utilizando una expresión lambda para
Comparator
:Y
List
tiene unsort(Comparator)
método, por lo que puede acortar esto aún más:Este es un idioma tan común que hay un método incorporado para generar un
Comparator
para una clase con unaComparable
clave:Todos estos son formas equivalentes.
fuente
int
y que es mejor usarDate#compareTo()
para esto. Por qué esto no se votó por encima de la otra respuesta está más allá de mí. Este enlace también puede ser útil: Tutorial para ordenar objetos en Sun.com .List.sort()
.Las clases que tienen un orden de clasificación natural (un Número de clase, como ejemplo) deben implementar la interfaz Comparable, mientras que las clases que no tienen un orden de clasificación natural (una Cátedra de clase, como ejemplo) deben contar con un Comparador (o un Comparador anónimo) clase).
Dos ejemplos:
Uso:
fuente
public
en frente declass
.Para ordenar un
ArrayList
, puede usar el siguiente fragmento de código:fuente
Sí tu puedes. Hay dos opciones para comparar elementos, la interfaz Comparable y el Comparador interfaz .
Ambas interfaces permiten un comportamiento diferente. Comparable le permite hacer que el objeto actúe como acaba de describir Strings (de hecho, String implementa Comparable). El segundo, Comparador, le permite hacer lo que está pidiendo. Lo harías así:
Eso hará que el método Collections.sort use su comparador para su mecanismo de clasificación. Si los objetos en ArrayList implementan comparables, puede hacer algo como esto:
La clase Colecciones contiene varias de estas herramientas útiles y comunes.
fuente
JAVA 8 expresión lambda
O
fuente
Collections.sort(studList, Comparator.comparing(Student::getFirstName));
studList.sort(Comparator.comparing(Student::getFirstName));
Con Java 8 puede usar una referencia de método para su comparador:
fuente
Como las tecnologías aparecen todos los días, la respuesta cambiará con el tiempo. Eché un vistazo a LambdaJ y parece muy interesante.
Puedes intentar resolver estas tareas con LambdaJ . Puede encontrarlo aquí: http://code.google.com/p/lambdaj/
Aquí tienes un ejemplo:
Ordenar iterativo
Ordenar con lambda
Por supuesto, tener este tipo de belleza impacta en el rendimiento (un promedio de 2 veces), pero ¿puedes encontrar un código más legible?
fuente
fuente
La mejor manera fácil con JAVA 8 es para ordenar alfabéticamente en inglés
Implementación de clase
Ordenar
Si desea ordenar por un alfabeto que contiene caracteres que no están en inglés, puede usar Locale ... Debajo del código, use la clasificación de caracteres turcos ...
Implementación de clase
Ordenar
fuente
Referencia de función y método
El
Collections.sort
método puede ordenarList
usando unComparator
pase. EsoComparator
se puede implementar utilizando elComparator.comparing
método donde puede pasar una referencia de método según sea necesarioFunction
. Afortunadamente, el código real es mucho más simple y más corto que esta descripción.Para Java 8:
o
Otra forma es
fuente
De
Java 8
adelante en adelante no tenemos que usarloCollections.sort()
directamente.List
La interfaz tiene unsort()
método predeterminado :Ver http://visvv.blogspot.in/2016/01/sorting-objects-in-java-8.html .
fuente
Java 8 Lambda acorta el género.
fuente
Collections.sort(stdList, Comparator.comparing(SomeClass::getName));
Puede usar el Bean Comparator para ordenar cualquier propiedad de su clase personalizada.
fuente
Sí, eso es posible, por ejemplo, en esta respuesta clasifico por la propiedad
v
de la claseIndexValue
Si observa aquí, estoy creando una clase interna anónima (que es el Java para cierres) y la paso directamente al
sort
método de la claseArrays
Su objeto también puede implementarse
Comparable
(eso es lo que hace String y la mayoría de las bibliotecas principales en Java), pero eso definiría el "orden de clasificación natural" de la clase en sí mismo, y no le permite conectar otras nuevas.fuente
Comparator
:)Encontré que la mayoría de estas respuestas, si no todas, se basan en la clase subyacente (Objeto) para implementar una interfaz comparable o tener una interfaz comparable de ayuda.
¡No con mi solución! El siguiente código le permite comparar el campo del objeto al conocer su nombre de cadena. Puede modificarlo fácilmente para no usar el nombre, pero luego debe exponerlo o construir uno de los Objetos con los que desea comparar.
fuente
Puedes probar el pedido de guayaba :
fuente
Puedes ordenar usando java 8
fuente
Estos fragmentos de código pueden ser útiles. Si desea ordenar un objeto en mi caso, quiero ordenar por nombre de volumen:
Esto funciona. Lo uso en mi jsp.
fuente
Con esta biblioteca aquí puede ordenar la lista de objetos personalizados en varias columnas. La biblioteca utiliza características de la versión 8.0. La muestra también está disponible allí. Aquí hay una muestra para hacer
fuente
Puede echar un vistazo a esta presentación en el Foro Java en Stuttgart, Alemania, en 2016.
Solo unas pocas diapositivas usan el idioma alemán, el 99% del contenido es código fuente Java "basado en inglés"; me gusta
dónde
OurCustomComparator
está utilizando métodos predeterminados (y otras ideas interesantes). Como se muestra, conduce a un código muy conciso para elegir algún método getter para ordenar; y encadenamiento súper simple (o inversión) de criterios de clasificación.Si te gusta Java8, encontrarás una gran cantidad de material para comenzar.
fuente
Nuevo desde 1.8 es un método List.sort () en lugar de usar Collection.sort (), por lo que llama directamente a mylistcontainer.sort ()
Aquí hay un fragmento de código que muestra la función List.sort ():
La clase de frutas es:
fuente
su clase customComparator debe implementar java.util.Comparator para poder ser utilizado. también debe anular compare () AND equals ()
compare () debe responder la pregunta: ¿Es el objeto 1 menor que, igual o mayor que el objeto 2?
documentos completos: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html
fuente
Prefiero este proceso:
Si su lista de objetos tiene una propiedad llamada
startDate
, llame a use this una y otra vez. Incluso puedes encadenarlosstartDate.time
.Esto requiere que el objeto a ser
Comparable
lo que significa que necesita unacompareTo
,equals
yhashCode
la implementación.Sí, podría ser más rápido ... Pero ahora no tiene que hacer un nuevo comparador para cada tipo de género. Si puede ahorrar tiempo de desarrollo y renunciar al tiempo de ejecución, puede optar por este.
fuente
El uso de Java 8 puede definir el uso
Comparator
de una línea usandoComparator.comparing()
Utilice cualquiera de las siguientes formas:
Opción 1:
Opcion 2:
fuente
Su clase personalizada puede implementar la interfaz "Comparable", que requiere una implementación del método CompareTo. En el método CompareTo, puede definir lo que significa que un objeto es menor o mayor que el otro objeto. Entonces, en su ejemplo, puede verse más o menos así:
..........
Un número negativo indica que esto es más pequeño que el objeto con el que se compara. Un número positivo indica que esto es mayor que el objeto comparado con el objeto y un cero significa que los objetos son iguales.
Luego puede usar collections.sort (myList) para ordenar su lista sin tener que alimentar en un comparador. Este método también tiene la ventaja de ordenar las cosas automáticamente si utiliza una estructura de datos de recopilación ordenada como un TreeSet o un TreeMap.
Puede consultar este artículo si desea leer más sobre la interfaz comparable (divulgación: soy el autor;)) https://nullbeans.com/the-java-comparable-interface-automatic-sort-of-collections/
fuente
También puede usar Springs PropertyComparator si solo tiene una ruta de propiedad de cadena a la propiedad (anidada) que desea ordenar:
El inconveniente es que este comparador ignora silenciosamente las propiedades que no existen o no son accesibles y lo maneja como valor nulo para la comparación. Esto significa que debe probar cuidadosamente dicho comparador o validar la existencia de la ruta de la propiedad de alguna manera.
fuente
usando la API de flujo de Java-8 puede ordenar un
ArrayList
por:fuente
He probado muchas soluciones diferentes disponibles en Internet, pero la solución que funciona para mí está disponible en el siguiente enlace.
https://www.java67.com/2017/07/how-to-sort-arraylist-of-objects-using.html
fuente