Ver Mensaje Individual
  #18 (permalink)  
Antiguo 24/10/2014, 12:45
Avatar de Profesor_Falken
Profesor_Falken
 
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 10 años, 3 meses
Puntos: 182
Respuesta: Ordenar ArrayList

Ya, y también tendrás el mismo problema con los acentos.

Utilizando una complementación de Collator (clase añadida con Java 5 y una de las grandes olvidadas de Java), puede realizar comparaciones de lenguaje natural fácilmente. Solo debes cambiar dos lineas.

1- Crear un collator utilizando el locale que nos interese, en este caso el español:
Collator collator = Collator.getInstance(new Locale("es", "ES"));


2- Luego cuando haces la comparacion de letras, puedes usar el collator para comparar. Collator trabaja con Strings, por lo que podemos hacer una conversion:
int comp = collator.compare(String.valueOf(charO1), String.valueOf(charO2));

Esto aplicaría tanto para el código que te puse como para el de HackmanC

Por ejemplo, partiendo de mi código inicial:

Código Java:
Ver original
  1. public class Prueba {
  2.  
  3.     public static void main(String[] args) {
  4.         // TODO Auto-generated method stub
  5.         List<String> lista = new ArrayList<>();
  6.  
  7.         //solo letras minusculas
  8.         lista.add("12a");
  9.         lista.add("acd");
  10.         lista.add("and");
  11.         lista.add("aod");        
  12.         lista.add("a%c");        
  13.         lista.add("a0d");
  14.         lista.add("aád");
  15.         lista.add("bdc");
  16.         lista.add("añd");
  17.         lista.add("bc"); //las contrasenas no tienen que ser del mismo tamano
  18.  
  19.         Collections.sort(lista, new Ordenar());
  20.  
  21.         System.out.print(lista);
  22.     }
  23. }
  24.  
  25. class Ordenar implements Comparator<String> {
  26.  
  27.     @Override
  28.     public int compare(String o1, String o2) {
  29.         if (o1 == null && o2 == null) {
  30.             return 0;
  31.         } else if (o2 == null) {
  32.             return -1;
  33.         } else if (o1 == null) {
  34.             return 1;
  35.         }
  36.         Collator collator = Collator.getInstance(new Locale("es", "ES"));
  37.  
  38.         //Select shortest to pivot on
  39.         int shortest = (o1.length() <= o2.length()) ? o1.length() : o2.length();
  40.  
  41.         for (int i = 0; i < shortest; i++) {
  42.             char charO1 = o1.charAt(i);
  43.             char charO2 = o2.charAt(i);
  44.  
  45.             if (Character.isLetter(charO1)) {
  46.                 if (!Character.isLetter(charO2)) {
  47.                     return -1;
  48.                 } else {
  49.                     int comp = collator.compare(String.valueOf(charO1), String.valueOf(charO2));
  50.                     if (comp != 0) {
  51.                         return comp;
  52.                     }
  53.                 }
  54.             } else if (Character.isDigit(charO1)) {
  55.                 if (Character.isLetter(charO2)) {
  56.                     return 1;
  57.                 } else if (Character.isDigit(charO2)) {
  58.                     int comp = collator.compare(charO1, charO2);
  59.                     if (comp != 0) {
  60.                         return comp;
  61.                     }
  62.                 } else {
  63.                     return -1;
  64.                 }
  65.             } else {
  66.                 if (Character.isLetter(charO2) || Character.isDigit(charO2)) {
  67.                     return 1;
  68.                 } else {
  69.                     int comp = collator.compare(charO1, charO2);
  70.                     if (comp != 0) {
  71.                         return comp;
  72.                     }
  73.                 }
  74.             }
  75.         }
  76.  
  77.         return (o1.length() <= o2.length()) ? -1 : 1;
  78.     }
  79. }

Resultado: [aád, acd, and, añd, aod, a0d, a%c, bc, bdc, 12a]

Un saludo
__________________
If to err is human, then programmers are the most human of us