Ordenar la lista de listas en orden alfabético (sin distinción entre mayúsculas y minúsculas)

121

Tengo una lista de cadenas namesque contiene nombres de personas. Quiero ordenar la lista de arrays en orden alfabético.

ArrayList<String> names = new ArrayList<String>();
names.add("seetha");
names.add("sudhin");
names.add("Swetha");
names.add("Neethu");
names.add("ananya");
names.add("Athira");
names.add("bala");
names.add("Tony");
names.add("Karthika");
names.add("Nithin");
names.add("Vinod");
names.add("jeena");
Collections.sort(names);
for(int i=0; i<names.size(); i++)
    System.out.println(names.get(i));

Traté de ordenar la lista de la manera anterior. Pero muestra la matriz ordenada como:

Athira
Karthika
..
..
ananya
bala
...

pero no quiero que sea sensible a mayúsculas y minúsculas. Quiero el resultado como:

ananya
Athira
bala
andro-niña
fuente

Respuestas:

330

La costumbre Comparatordebería ayudar

Collections.sort(list, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.compareToIgnoreCase(s2);
    }
});

O si está utilizando Java 8:

list.sort(String::compareToIgnoreCase);
denis.solonenko
fuente
1
¿Puedes decirme qué es la cadena s1 y s2? y cómo puedo ver el resultado si la función de comparación devuelve un valor entero.
andro-girl
@seethalakshmi son las cadenas de tu lista. Eche un vistazo a las fuentes del método Collections.sort si desea obtener más detalles al respecto
denis.solonenko
Quiero mostrar la lista ordenada en logcat. ¿Cómo puedo hacer eso?
andro-girl
Aparecerá como un Objeto, a menos que desgloses la lista con un bucle después de ordenar. for (TYPE newvariable : ARRAYTYPE arrayname) { Log.i("YOURAPPTAG", newvariable); }
Carrito abandonado
2
@Dante si observa la implementación de String.CASE_INSENSITIVE_ORDER, verá que A1 está condicionado lessque A10 solo porque la longitud es menor. No hay soporte de "tipo natural" fuera de la caja, es posible que desee echar un vistazo a stackoverflow.com/questions/1262239/…
denis.solonenko
195

Lo más simple es:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
djunod
fuente
@djunod, gracias por la respuesta. También probé su solución para ArrayList de A1 a A10, pero la A10 no se clasificó correctamente al igual que la solución de denis.solenenko. De alguna manera, el A10 va después de A1. Básicamente, se ordenó como A1, A10, A2, A3, etc. ¿Por qué sucedió y cómo puedo ordenar la lista correctamente?
Dante
2
@dante, esa es la clasificación normal de cadenas. Si desea que A2 venga antes que A10, tendrá que cambiarlo a A02, etc.
djunod
1
Plus 1. Trabajó en Android también. Gracias y felicidades.
statosdotcom
@djunod Muchas gracias :)
Kumar
stackoverflow debería proporcionarme una opción para guardar respuestas / fragmentos como este ..
HB.
29

prueba este código

Collections.sort(yourarraylist, new SortBasedOnName());



import java.util.Comparator;
import com.RealHelp.objects.FBFriends_Obj;
import com.RealHelp.ui.importFBContacts;

public class SortBasedOnName implements Comparator
{
public int compare(Object o1, Object o2) 
{

    FBFriends_Obj dd1 = (FBFriends_Obj)o1;// where FBFriends_Obj is your object class
    FBFriends_Obj dd2 = (FBFriends_Obj)o2;
    return dd1.uname.compareToIgnoreCase(dd2.uname);//where uname is field name
}

}
hacker
fuente
3
¡Gran respuesta! Creo que si cambia 'implements Comparator' a 'implements Comparator <FBFriends_Obj> y cambia los tipos de Objetos en la comparación con FBFriends_Obj, entonces no necesita dd1 y dd2, puede usar o1 y o2 directamente en la declaración de devolución
FrinkTheBrave
11

Basado en las respuestas mencionadas anteriormente, logré comparar mis objetos de clase personalizados de esta manera:

ArrayList<Item> itemList = new ArrayList<>();
...
Collections.sort(itemList, new Comparator<Item>() {
            @Override
            public int compare(Item item, Item t1) {
                String s1 = item.getTitle();
                String s2 = t1.getTitle();
                return s1.compareToIgnoreCase(s2);
            }

        });
Usman
fuente
4

Debe usar un comparador personalizado que usará compareToIgnoreCase, no compareTo.

Vladimir Ivanov
fuente
No probé este link.but im capaz de encontrar d solution.can u PLZ explicar
andro-chica
3

A partir de Java 8 puede usar Stream:

List<String> sorted = Arrays.asList(
                          names.stream().sorted(
                              (s1, s2) -> s1.compareToIgnoreCase(s2)
                          ).toArray(String[]::new)
                      );

Obtiene una secuencia de eso ArrayList, luego lo ordena (ignorando el caso). Después de eso, la secuencia se convierte en una matriz que se convierte en unArrayList .

Si imprime el resultado usando:

System.out.println(sorted);

obtienes el siguiente resultado:

[ananya, Athira, bala, jeena, Karthika, Neethu, Nithin, seetha, sudhin, Swetha, Tony, Vinod]
RUMANIA_ingeniero
fuente
3

Desafortunadamente, todas las respuestas hasta ahora no tienen en cuenta que "a"no deben considerarse iguales a "A"la hora de ordenar.

String[] array = {"b", "A", "C", "B", "a"};

// Approach 1
Arrays.sort(array);
// array is [A, B, C, a, b]

// Approach 2
Arrays.sort(array, String.CASE_INSENSITIVE_ORDER);
// array is [A, a, b, B, C]

// Approach 3
Arrays.sort(array, java.text.Collator.getInstance());
// array is [a, A, b, B, C]

En el enfoque 1, cualquier letra minúscula se considera mayor que cualquier letra mayúscula.

El enfoque 2 lo empeora, ya que CASE_INSENSITIVE_ORDER considera "a"e "A"igual (el resultado de la comparación es 0). Esto hace que la ordenación no sea determinista.

El Enfoque 3 (usando un java.text.Collator) es, en mi humilde opinión, la única forma de hacerlo correctamente, ya que lo considera "a"y "A"no es igual, pero los coloca en el orden correcto de acuerdo con la configuración regional actual (o cualquier otra deseada).

Lars Gendner
fuente