Supongamos que queremos revertir la siguiente Cadena "áe".Cómo obtener una Cadena invertida (caja fuerte Unicode)
El unicode para eso es "\ u0061 \ u0301 \ u0065".
El abordaje ingenua de revertir sería charla por Char
private static String reverseStringNaive(String s) {
char[] characters = new char[s.length()];
for (int i = s.length() - 1; i >= 0; i--) {
int j = s.length() - i - 1;
characters[j] = s.charAt(i);
}
return new String(characters);
}
que nos da "EA" (\ u0065 \ u0301 \ u0061) cuando esperamos conseguir "EA" (\ u0065 \ u0061 \ u0301). El acento agudo "'" debe permanecer junto con la "a", no cambiar a la "e".
El siguiente código me da el resultado esperado para esa cadena:
private static String reverseString(String s) {
char[] characters = new char[s.length()];
for (int i = s.length() - 1; i >= 0; i--) {
int j = s.length() - i - 1;
if (Character.isLetterOrDigit(s.charAt(i)) || Character.isISOControl(s.charAt(i))) {
characters[j] = s.charAt(i);
} else {
characters[j] = s.charAt(i-1);
characters[j+1] = s.charAt(i);
i--;
}
}
return new String(characters);
}
estoy comprobando si cada carácter es letra, dígito o Control ISO. Si no, supongo que debe permanecer junto con el personaje anterior.
La pregunta es, ¿hay otras cosas que deba consultar o preocuparse? ¿Mi enfoque sigue siendo ingenuo?
¿Qué hay de http://commons.apache.org/lang/api-2.5/org/apache/commons/lang/StringUtils.html#reverse(java.lang.String)? –
Hace el enfoque ingenuo. Da el resultado incorrecto – pablosaraiva
De acuerdo con javadoc, usa un 'StringBuffer.reverse()' y esto debería funcionar, vea http://download.oracle.com/javase/1.5.0/docs/api/java/lang/StringBuffer.html#reverse () –