Предположим, мы хотим вернуть следующую строку "áe".
Юникодом для этого является "\ u0061 \ u0001 \ u0065".
Наивный подход к его возвращению будет символом 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);
}
, который дает нам "éa" (\ u0065 \ u0001), когда мы надеемся получить "eá" (\ u0065 \ u0301). Акцент «´» должен слипаться с «а», а не с «е».
Следующий код дает мне ожидаемый результат для этой строки:
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);
}
Я проверяю, является ли каждый символ буквой, цифрой или ISO Control. Если нет, я предполагаю, что это должно слипаться с предыдущим символом.
Вопрос в том, есть ли другие вещи, которые я должен проверить или беспокоиться? Мой подход все еще наивен?