Як зазначають інші, кращим способом є використання:
new StringBuilder(hi).reverse().toString()
Але якщо ви хочете реалізувати це самостійно, я боюся, що решта відповідей має недоліки.
Причина полягає в тому, що String
представляє список точок Unicode , кодованих у char[]
масиві відповідно до кодування змінної довжини: UTF-16 .
Це означає, що деякі кодові точки використовують один елемент масиву (одна одиниця коду), а інші використовують два з них, тому можуть бути пари символів, які повинні розглядатися як одна одиниця (послідовні сурогати "високий" та "низький") .
public static String reverseString(String s) {
char[] chars = new char[s.length()];
boolean twoCharCodepoint = false;
for (int i = 0; i < s.length(); i++) {
chars[s.length() - 1 - i] = s.charAt(i);
if (twoCharCodepoint) {
swap(chars, s.length() - 1 - i, s.length() - i);
}
twoCharCodepoint = !Character.isBmpCodePoint(s.codePointAt(i));
}
return new String(chars);
}
private static void swap(char[] array, int i, int j) {
char temp = array[i];
array[i] = array[j];
array[j] = temp;
}
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("C:/temp/reverse-string.txt");
StringBuilder sb = new StringBuilder("Linear B Syllable B008 A: ");
sb.appendCodePoint(65536); //http://unicode-table.com/es/#10000
sb.append(".");
fos.write(sb.toString().getBytes("UTF-16"));
fos.write("\n".getBytes("UTF-16"));
fos.write(reverseString(sb.toString()).getBytes("UTF-16"));
}