जैसा कि दूसरों ने बताया है कि पसंदीदा तरीका उपयोग करना है:
new StringBuilder(hi).reverse().toString()
लेकिन अगर आप इसे खुद से लागू करना चाहते हैं, तो मुझे डर है कि बाकी प्रतिक्रियाओं में खामियां हैं।
कारण यह है कि चर-लंबाई एन्कोडिंग के अनुसार एक सरणी में एन्कोडेड यूनिकोड बिंदुओं String
की एक सूची का प्रतिनिधित्व करता है : UTF-16 ।char[]
इसका मतलब है कि कुछ कोड पॉइंट ऐरे (एक कोड यूनिट) के एक तत्व का उपयोग करते हैं, लेकिन अन्य उनमें से दो का उपयोग करते हैं, इसलिए ऐसे पात्रों के जोड़े हो सकते हैं जिन्हें एकल यूनिट (लगातार "उच्च" और "कम" सरोगेट्स) माना जाना चाहिए ।
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"));
}