una reves reversa recursividad palabras orden metodo invertir invertida inverso imprimir como cadena arreglo java string unicode

java - reves - Cómo obtener una cadena invertida(unicode seguro)



metodo reverse en java (1)

Su problema también podría resolverse convirtiendo la cadena en la forma de descomposición canónica NFC. Básicamente, la clase java.text.Normalizer se puede usar para combinar acentos y otros caracteres combinados con sus caracteres básicos para que pueda revertir correctamente.

Todas estas otras ideas (String.reverse (), StringBuffer.reverse ()) invertirán correctamente los caracteres en su búfer, pero si comienza con caracteres descompuestos, es posible que no obtenga lo que espera :).

En algunas "formas de descomposición", los caracteres de acento se almacenan separados de sus formas base (como caracteres separados), pero en forma "combinada" no lo son. Entonces, en una forma, "áe" se almacena como tres caracteres, y en la otra forma combinada, como dos.

Sin embargo, tal normalización no es suficiente para manejar otros tipos de combinación de caracteres, ni puede dar cuenta de los caracteres en los planos astrales de Unicode, que se almacenan como dos caracteres (o más) en Java.

Gracias a tchrist por señalar el soporte de ICU para la segmentación de texto, incluidos los grupos de grafemas extendidos, como el que se identifica en los comentarios a continuación (ver virama). Este recurso parece ser la fuente autorizada de información sobre este tipo de cosas.

Supongamos que queremos revertir la siguiente Cadena "áe".

El Unicode para eso es "/ u0061 / u0301 / u0065".

El ingenuo enfoque de revertirlo sería char by 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); }

lo que nos da "éa" (/ u0065 / u0301 / u0061) cuando esperamos obtener "eá" (/ u0065 / u0061 / u0301). El acento de acento "´" debe mantenerse 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 Carta, Dígito o Control ISO. Si no es así, supongo que debería permanecer junto con el personaje anterior.

La pregunta es, ¿hay otras cosas que debería revisar o preocuparme? ¿Es mi enfoque todavía ingenuo?