2011-04-28 18 views
95

Tengo una lista de cadenas names que contiene nombres de personas. Quiero ordenar la lista de arrays en orden alfabético.Ordenando la lista de arrays en orden alfabético (sin distinción entre mayúsculas y minúsculas)

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

He intentado ordenar la lista de la manera descrita anteriormente. Pero está mostrando la matriz ordenada como:

Athira 
Karthika 
.. 
.. 
ananya 
bala 
... 

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

ananya 
Athira 
bala 

Respuesta

268

personalizada Comparator deberí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); 
+0

¿Puede decirme qué es la cadena s1 y s2? Y cómo puede ver el resultado si la función de comparación regresa a la integral valor de r –

+0

no se dio cuenta de los comentarios antes de publicar .. –

+0

@seethalakshmi esa es la cadena de su lista. Por favor, eche un vistazo a las fuentes del método Collections.sort si desea obtener más detalles sobre ese –

3

Es necesario utilizar comparador personalizada que utilizará compareToIgnoreCase, no comparar a.

+0

intenté este enlace. Pero no soy capaz de encontrar la solución d. Puede explicar por favor –

167

Lo más sencillo que hacer es:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER); 
+0

@djunod, gracias por la respuesta. También probé tu solución para ArrayList desde la A1 hasta la A10, pero la A10 no se clasificó correctamente como la solución de denis.solenenko. De alguna manera, el A10 va después de A1. Básicamente, clasificó como A1, A10, A2, A3, etc. ¿Por qué sucedió y cómo puedo ordenar la lista correctamente? – Dante

+2

@dante, que es la clasificación normal de cadenas. Si quiere que A2 venga antes que A10, tendrá que cambiarlo a A02, etc. – djunod

+0

Plus 1. También funcionó en Android. Gracias y felicidades. – statosdotcom

27

tratar 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

¡Excelente respuesta! Creo que si cambias 'implementa Comparator' por 'implementa Comparator y cambias los tipos de objeto en la comparación a FBFriends_Obj entonces no necesitas dd1 y dd2 puedes usar o1 y o2 directamente en la declaración de devolución – FrinkTheBrave

2

A partir de Java 8 puede utilizar Stream:

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

Se obtiene una corriente de ese ArrayList, entonces lo ordena (ignorando el caso). Después de eso, la secuencia se convierte en una matriz que se convierte en ArrayList.

Si imprime el resultado usando:

System.out.println(sorted); 

se obtiene el siguiente resultado:

[ananya, Athira, bala, jeena, Karthika, Neethu, Nithin, seetha, sudhin, Swetha, Tony, Vinod] 
5

Sobre la base de las respuestas anteriormente mencionado, pude comparar mis objetos de clases personalizadas como esto:

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

     }); 
Cuestiones relacionadas