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

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);

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, 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
}

}

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);
            }

        });


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]

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.