Tengo clase simple
public class ActiveAlarm {
public long timeStarted;
public long timeEnded;
private String name = "";
private String description = "";
private String event;
private boolean live = false;
}
y List<ActiveAlarm>
con. ¿Cómo ordenar en orden ascendente por timeStarted
, luego por timeEnded
? ¿Alguien puede ayudar? Sé en C ++ con algoritmo genérico y operador de sobrecarga <, pero soy nuevo en Java.
java
sorting
sort-object
Jennifer
fuente
fuente
Respuestas:
O bien
ActiveAlarm
implementeComparable<ActiveAlarm>
o implementeComparator<ActiveAlarm>
en una clase separada. Luego llame:o
En general, es una buena idea para poner en práctica
Comparable<T>
si hay una sola orden "natural" ... en caso contrario (si por casualidad que desee ordenar en un orden particular, pero igualmente podría querer fácilmente una diferente) que es mejor para poner en prácticaComparator<T>
. Esta situación particular podría ir en cualquier dirección, para ser honesto ... pero probablemente me quedaría con laComparator<T>
opción más flexible .EDITAR: Implementación de muestra:
fuente
a = Long.MIN_VALUE, b = 1
..compare
Utilizando
Comparator
Por ejemplo:
Con Java 8 en adelante, simplemente puede usar la expresión lambda para representar la instancia de Comparator.
fuente
compareTo()
hacer? ¿De dónde viene? ¿Dónde tengo que definirlo?getScores()
es el getter para elscores
cual es unList<Integer>
. Cuando lo hacesgetScores().get(0)
, obtienes unInteger
objeto.Integer
ya tienecompareTo(anotherInteger)
implementado el método, no tiene que definirlo.JAVA 8 y la respuesta anterior (Uso de expresiones Lambda)
¡En Java 8, se introdujeron expresiones Lambda para hacer esto aún más fácil! En lugar de crear un objeto Comparator () con todos sus andamios, puede simplificarlo de la siguiente manera: (Usando su objeto como ejemplo)
o incluso más corto:
Esa declaración es equivalente a lo siguiente:
Piense en las expresiones de Lambda como algo que solo requiere que ingrese las partes relevantes del código: la firma del método y lo que se devuelve.
Otra parte de su pregunta fue cómo comparar con múltiples campos. Para hacer eso con las expresiones Lambda, puede usar la
.thenComparing()
función para combinar efectivamente dos comparaciones en una:El código anterior ordenará la lista primero por
timeStarted
, y luego portimeEnded
(para aquellos registros que tengan el mismotimeStarted
).Una última nota: es fácil comparar primitivas 'largas' o 'int', solo puede restar una de la otra. Si está comparando objetos ('Long' o 'String'), le sugiero que use su comparación integrada. Ejemplo:
EDITAR: Gracias a Lukas Eder por indicarme que
.thenComparing()
funcione.fuente
Comparator.comparing().thenComparing()
...Collections
más, puede llamar directamente a la lista. Por ejemplo:myList.sort(Comparator.comparing(Address::getZipCode).thenComparing(Compartor.comparing(Address::getStreetName));
Podemos ordenar la lista de una de dos maneras:
1. Uso del comparador : cuando sea necesario usar la lógica de clasificación en varios lugares Si desea usar la lógica de clasificación en un solo lugar, puede escribir una clase interna anónima de la siguiente manera, o bien extraer el comparador y usarlo en varios lugares
Podemos tener una comprobación nula de las propiedades, si pudiéramos haber usado 'Long' en lugar de 'long'.
2. Uso de Comparable (ordenamiento natural) : si el algoritmo de clasificación siempre se adhiere a una propiedad: escriba una clase que implemente el método 'Comparable' y anule el método 'compareTo' como se define a continuación
}
llame al método de clasificación para ordenar según el orden natural
fuente
En java8 + esto se puede escribir en una sola línea de la siguiente manera:
collectionObjec.sort(comparator_lamda)
ocomparator.comparing(CollectionType::getterOfProperty)
código:
o
fuente
Eso debería darte una idea aproximada. Una vez hecho esto, puede llamar
Collections.sort()
a la lista.fuente
Desde Java8 esto se puede hacer aún más limpio usando una combinación de
Comparator
yLambda expressions
Por ejemplo:
fuente
Cadena de comparación de guayaba :
fuente
Puedes usar
Collections.sort
y pasar tu propioComparator<ActiveAlarm>
fuente
En Java necesitas usar el
Collections.sort
método estático . Aquí hay un ejemplo de una lista de objetos CompanyRole, ordenados primero por comienzo y luego por fin. Puede adaptarse fácilmente a su propio objeto.fuente
Puede llamar a Collections.sort () y pasar un Comparador que necesita escribir para comparar diferentes propiedades del objeto.
fuente
Como se mencionó, puede ordenar por:
Comparable
Comparator
aCollections.sort
Si hace ambas cosas,
Comparable
se ignorará yComparator
se utilizará. Esto ayuda a que los objetos de valor tengan su propia lógica,Comparable
que es el tipo más razonable para su objeto de valor, mientras que cada caso de uso individual tiene su propia implementación.fuente