Tengo una lista de objetos como List<Object> p
. Quiero ordenar esta lista alfabéticamente usando el campo de nombre de objeto. El objeto contiene 10 campos y el campo de nombre es uno de ellos.
if (list.size() > 0) {
Collections.sort(list, new Comparator<Campaign>() {
@Override
public int compare(final Object object1, final Object object2) {
return String.compare(object1.getName(), object2.getName());
}
} );
}
Pero no hay nada como String.compare ..?
Object
No tengo nombres. ¿Te refieres a usar.toString()
?object1
yobject2
debe ser de tipoCampaign
, y la función de comparación esobject1.getName().compareTo(object2.getName())
.List<Object>
yComparator<Campaign>
. No puedes hacer eso. O tienesList<Object>
yComparator<Object>
oList<Campaign>
eComparator<Campaign>
Respuestas:
A partir de su código, parece que
Comparator
ya está parametrizado conCampaign
. Esto solo funcionará conList<Campaign>
. Además, el método que está buscando escompareTo
.O si está utilizando Java 1.8
Un comentario final: no tiene sentido verificar el tamaño de la lista. Ordenar funcionará en una lista vacía.
fuente
Comparator.comparing(Campaign::getName)
list.sort((object1, object2) -> object1. getName().compareTo(object2. getName()));
trabajó para mísortedList = list.stream().sort((object1, object2) -> object1. getName().compareTo(object2. getName()))..collect(Collectors.toList());
para obtener una nueva lista ordenadaLa forma más correcta de ordenar alfabéticamente cadenas es usar
Collator
, debido a la internacionalización. Algunos idiomas tienen un orden diferente debido a algunos caracteres adicionales, etc.Si no le importa el uso de la internacionalización
string.compare(otherString)
.fuente
Echar un vistazo a
Collections.sort()
, y elComparator
interfaz.La comparación de cadenas se puede realizar con
object1.getName().compareTo(object2.getName())
oobject2.getName().compareTo(object1.getName())
(según la dirección de clasificación que desee).Si desea que el tipo sea independiente del caso, hágalo
object1.getName().toUpperCase().compareTo(object2.getName().toUpperCase())
.fuente
nama
delObject
tipo? esta respuesta no es completa.Utilizando Java 8 Comparator.comparing :
fuente
Reemplace el objeto con su clase que contiene el campo de nombre
Uso:
fuente
obj1.getName().compareTo(obj2.getName()
conobj2.getName().compareTo(obj1.getName()
en la clase de comparadoralgo como
fuente
Aquí hay una versión de la respuesta de Robert B que funciona
List<T>
y ordena por una propiedad String especificada del objeto usando Reflection y sin bibliotecas de tercerosfuente
Puede usar
sortThisBy()
de Eclipse Collections :Si no puede cambiar el tipo de lista de
List
:Nota: Soy colaborador de Eclipse Collections.
fuente
Prueba esto:
fuente
Si sus objetos tienen algún ancestro común [déjelo ser
T
], debe usar enList<T>
lugar deList<Object>
e implementar un Comparador para esta T, usando el campo de nombre.Si no tiene un ancestro común, puede implementar un Comperator y usar la reflexión para extraer el nombre.Tenga en cuenta que no es seguro, no se sugiere y tiene un mal rendimiento para usar la reflexión, pero le permite acceder a un nombre de campo. sin saber nada sobre el tipo real del objeto [además del hecho de que tiene un campo con el nombre relevante]
En ambos casos, debe usar Collections.sort () para ordenar.
fuente
Encontré otra forma de escribir.
fuente
Esto supone una lista de en
YourClass
lugar deObject
, como explica amit .Puede usar este bit de la biblioteca de Google Guava:
Las otras respuestas que mencionan
Comparator
no son incorrectas, ya queOrdering
implementaComparator
. Esta solución es, en mi opinión, un poco más fácil, aunque puede ser más difícil si eres un principiante y no estás acostumbrado a usar bibliotecas y / o "programación funcional".Copiado descaradamente de esta respuesta a mi propia pregunta.
fuente
Usando una selección Ordenar
fuente
Collections.sort()
? (2) la lista es de tipoList<Object>
y, porlist.get(j).getName()
lo tanto , no se compilará. (3) esta solución es O (n ^ 2), mientras que usarCollections.sort()
es una mejor solución O (nlogn).Si está utilizando
List<Object>
para contener objetos de un subtipo que tiene un campo de nombre (llamemos al subtipoNamedObject
), necesitará abatir los elementos de la lista para acceder al nombre. Tienes 3 opciones, la mejor de las cuales es la primera:List<Object>
En primer lugar, no use un si puede evitarlo; mantenga los objetos con nombre en unList<NamedObject>
List<Object>
elementos en unList<NamedObject>
, reduciendo en el proceso, haga la clasificación y luego cópielos de nuevoLa opción 3 se vería así:
fuente
fuente
La respuesta de @ Victor funcionó para mí y volver a publicarla aquí en Kotlin en caso de que sea útil para otra persona que usa Android.
fuente