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 originalpublic class Prueba {
public static void main
(String[] args
) { // TODO Auto-generated method stub
List<String> lista = new ArrayList<>();
//solo letras minusculas
lista.add("12a");
lista.add("acd");
lista.add("and");
lista.add("aod");
lista.add("a%c");
lista.add("a0d");
lista.add("aád");
lista.add("bdc");
lista.add("añd");
lista.add("bc"); //las contrasenas no tienen que ser del mismo tamano
}
}
class Ordenar implements Comparator<String> {
@Override
if (o1 == null && o2 == null) {
return 0;
} else if (o2 == null) {
return -1;
} else if (o1 == null) {
return 1;
}
//Select shortest to pivot on
int shortest = (o1.length() <= o2.length()) ? o1.length() : o2.length();
for (int i = 0; i < shortest; i++) {
char charO1 = o1.charAt(i);
char charO2 = o2.charAt(i);
return -1;
} else {
int comp
= collator.
compare(String.
valueOf(charO1
),
String.
valueOf(charO2
)); if (comp != 0) {
return comp;
}
}
return 1;
int comp = collator.compare(charO1, charO2);
if (comp != 0) {
return comp;
}
} else {
return -1;
}
} else {
return 1;
} else {
int comp = collator.compare(charO1, charO2);
if (comp != 0) {
return comp;
}
}
}
}
return (o1.length() <= o2.length()) ? -1 : 1;
}
}
Resultado: [aád, acd, and, añd, aod, a0d, a%c, bc, bdc, 12a]
Un saludo