Java中反转字符串

589

9
@JRL 应该把代码改为 String ih = "dlroW olleH"; System.out.println(ih);,这样可以输出“Hello World”。 - Matthew Farwell
4
我希望我能撤回我投的关闭票(作为重复问题)。我重新阅读了其他问题,意识到它与这个问题有微妙的不同。但是,在整个网站上,这个问题仍然被重复提问很多次。可能应该找一个不同的问题来标记这个问题是重复的。 - Rob Hruska
38个回答

11

正如其他人指出的那样,首选方法是使用:

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"));
}

好的解决方案,唯一缺失的部分是现在处理组合变音符号 :-D - René

11

由于以下使用XOR的方法无法在列表中找到,因此我附加了这种反转字符串的方法。

算法基于:

1. (A XOR B) XOR B = A

2. (A XOR B) XOR A = B

代码片段:

public class ReverseUsingXOR {
    public static void main(String[] args) {
        String str = "prateek";
        reverseUsingXOR(str.toCharArray());
    }   

    /*Example:
     * str= prateek;
     * str[low]=p;
     * str[high]=k;
     * str[low]=p^k;
     * str[high]=(p^k)^k =p;
     * str[low]=(p^k)^p=k;
     * 
     * */
    public static void reverseUsingXOR(char[] str) {
        int low = 0;
        int high = str.length - 1;

        while (low < high) {
            str[low] = (char) (str[low] ^ str[high]);
            str[high] = (char) (str[low] ^ str[high]);   
            str[low] = (char) (str[low] ^ str[high]);
            low++;
            high--;
        }

        //display reversed string
        for (int i = 0; i < str.length; i++) {
            System.out.print(str[i]);
        }
    }

}

输出:

keetarp


5

在最少的代码行中非常简单

public class ReverseString {
    public static void main(String[] args) {
        String s1 = "neelendra";
        for(int i=s1.length()-1;i>=0;i--)
            {
                System.out.print(s1.charAt(i));
            }
    }
}

我本来想现在写这个.. 发现你已经写了它! - Jency

3
这对我有用。
public static void main(String[] args) {

    String text = "abcdefghijklmnopqrstuvwxyz";

    for (int i = (text.length() - 1); i >= 0; i--) {
        System.out.print(text.charAt(i));
    }
}

3

1. 使用字符数组:

public String reverseString(String inputString) {
    char[] inputStringArray = inputString.toCharArray();
    String reverseString = "";
    for (int i = inputStringArray.length - 1; i >= 0; i--) {
        reverseString += inputStringArray[i];
    }
    return reverseString;
}

2. Using StringBuilder:

public String reverseString(String inputString) {
    StringBuilder stringBuilder = new StringBuilder(inputString);
    stringBuilder = stringBuilder.reverse();
    return stringBuilder.toString();
}

或者

return new StringBuilder(inputString).reverse().toString();

2

将字符串反转的一种自然方法是使用StringTokenizer和一个栈。Stack是一个实现了易于使用的后进先出(LIFO)对象堆栈的类。

String s = "Hello My name is Sufiyan";

把它放在栈的前面。
Stack<String> myStack = new Stack<>();
StringTokenizer st = new StringTokenizer(s);
while (st.hasMoreTokens()) {
     myStack.push(st.nextToken());
}

倒序打印堆栈

System.out.print('"' + s + '"' + " backwards by word is:\n\t\"");
while (!myStack.empty()) {
  System.out.print(myStack.pop());
  System.out.print(' ');
}

System.out.println('"');

2
System.out.print("Please enter your name: ");
String name = keyboard.nextLine();

String reverse = new StringBuffer(name).reverse().toString();
String rev = reverse.toLowerCase();
System.out.println(rev);

我使用这种方法将名称倒序并转换为小写。

1
public class Test {

public static void main(String args[]) {
   StringBuffer buffer = new StringBuffer("Game Plan");
   buffer.reverse();
   System.out.println(buffer);
 }  
}

这并没有回答问题。 - Ryan

1

以上所有解决方案都很好,但是我在这里使用递归编程来制作反转字符串。

对于正在寻找递归方式进行字符串反转的人来说,这非常有帮助。

public class ReversString {

public static void main(String args[]) {
    char s[] = "Dhiral Pandya".toCharArray();
    String r = new String(reverse(0, s));
    System.out.println(r);
}

public static char[] reverse(int i, char source[]) {

    if (source.length / 2 == i) {
        return source;
    }

    char t = source[i];
    source[i] = source[source.length - 1 - i];
    source[source.length - 1 - i] = t;

    i++;
    return reverse(i, source);

}

}

1

步骤:

我们可以使用 split() 函数来拆分字符串,然后使用反向循环并添加字符。


代码片段:

class test
{
  public static void main(String args[]) 
  {
      String str = "world";
      String[] split= str.split("");

      String revers = "";
      for (int i = split.length-1; i>=0; i--)
      {
        revers += split[i];
      }
      System.out.printf("%s", revers);
   }  
}

 //output : dlrow


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接