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 ..?

ObjectNo tengo nombres. ¿Te refieres a usar.toString()?object1yobject2debe 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
Comparatorya 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 elComparatorinterfaz.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
namadelObjecttipo? 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
YourClasslugar deObject, como explica amit .Puede usar este bit de la biblioteca de Google Guava:
Las otras respuestas que mencionan
Comparatorno son incorrectas, ya queOrderingimplementaComparator. 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