在Java中反转一个字符串

Ron*_*Ron 437 java string

"Hello World"保留了一个名为的String变量hi.

我需要打印它,但反过来.

我怎样才能做到这一点?我知道Java中已经内置了某种功能.

相关:用Java反转"Hello World"字符串的每个单词

Dan*_*man 934

你可以用这个:

new StringBuilder(hi).reverse().toString()
Run Code Online (Sandbox Code Playgroud)

或者,对于早于JDK 1.5的版本,使用java.util.StringBuffer而不是StringBuilder- 它们具有相同的API.感谢评论员指出,StringBuilder如果没有并发问题,现在首选.

  • @ ha9u63ar对于本地一次性使用`StringBuilder`的情况并发不是一个问题(我认为这就是他的意思). (13认同)
  • "感谢评论员指出现在首选StringBuilder"?有一个明确的声明,如果线程安全是一个问题,StringBuffer.否则,可以使用StringBuilder.StringBuilder不是StringBuffer的替代品. (12认同)
  • 以下是了解两者之间确切差异的链接:http://www.javatpoint.com/difference-between-stringbuffer-and-stringbuilder简而言之:StringBuilder**比StringBuffer更高效**.它不是线程安全的,即多个线程可以同时调用StringBuilder的方法. (2认同)
  • 这不适用于 BMP 之外的 Unicode 字符,只要组合字符即可。 (2认同)
  • @Daniel Brockman,谢谢你的简洁回答.这里OP说,_I我将"Hello World"保存在一个名为hi_的String变量中.这意味着`String hi ="Hello World";`.所以我认为在你的答案中应该**不要**是'hi`周围的任何双引号.我的意思是它应该像这个`new StringBuilder(hi).reverse().toString()` (2认同)

Sam*_*awy 105

对于在线法官的问题,不允许StringBuilder或者StringBuffer,你可以做到这一点的地方使用char[]如下:

public static String reverse(String input){
    char[] in = input.toCharArray();
    int begin=0;
    int end=in.length-1;
    char temp;
    while(end>begin){
        temp = in[begin];
        in[begin]=in[end];
        in[end] = temp;
        end--;
        begin++;
    }
    return new String(in);
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上,它通常适用于大多数占用 2 个字节的字符。它实际上失败的是占用 2 x 16 位代码单元(UTF-16)的 Unicode 代码点。 (3认同)

Kev*_*sox 60

public static String reverseIt(String source) {
    int i, len = source.length();
    StringBuilder dest = new StringBuilder(len);

    for (i = (len - 1); i >= 0; i--){
        dest.append(source.charAt(i));
    }

    return dest.toString();
}
Run Code Online (Sandbox Code Playgroud)

http://www.java2s.com/Code/Java/Language-Basics/ReverseStringTest.htm

  • 这在一般情况下不起作用,因为它没有考虑到unicode中的某些"字符"由代理对表示,即两个Java字符,并且该解决方案导致该对的顺序错误.根据JavaDoc,StringBuilder的反向方法应该没问题:http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html#reverse() (30认同)
  • 好的解决方案(1+).一个增强 - StringBuilder(自java5起)将比StringBuffer更快.问候. (4认同)

Luc*_*ore 58

String string="whatever";
String reverse = new StringBuffer(string).reverse().toString();
System.out.println(reverse);
Run Code Online (Sandbox Code Playgroud)

  • 它的复杂性是什么?O(N)还是更多?N等于字符串的长度. (7认同)

Vik*_*ngh 26

我这样做是通过以下两种方式实现的:

通过CHARACTERS反转字符串:

public static void main(String[] args) {
    // Using traditional approach
    String result="";
    for(int i=string.length()-1; i>=0; i--) {
        result = result + string.charAt(i);
    }
    System.out.println(result);

    // Using StringBuffer class
    StringBuffer buffer = new StringBuffer(string);
    System.out.println(buffer.reverse());    
}
Run Code Online (Sandbox Code Playgroud)

由WORDS反向字符串:

public static void reverseStringByWords(String string) {
    StringBuilder stringBuilder = new StringBuilder();
    String[] words = string.split(" ");

    for (int j = words.length-1; j >= 0; j--) {
        stringBuilder.append(words[j]).append(' ');
    }
    System.out.println("Reverse words: " + stringBuilder);
}
Run Code Online (Sandbox Code Playgroud)


And*_*ggs 19

看一下StringBuffer下的Java 6 API

String s = "sample";
String result = new StringBuffer(s).reverse().toString();
Run Code Online (Sandbox Code Playgroud)


C0D*_*OU5 17

以下是使用递归的示例:

public void reverseString() {
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    String reverseAlphabet = reverse(alphabet, alphabet.length()-1);
}

String reverse(String stringToReverse, int index){
    if(index == 0){
        return stringToReverse.charAt(0) + "";
    }

    char letter = stringToReverse.charAt(index);
    return letter + reverse(stringToReverse, index-1);
}
Run Code Online (Sandbox Code Playgroud)

  • "更好的答案"概念是主观的.这可能正是某人正在寻找的. (14认同)
  • 已经有了更好的答案,特别是@ DanielBrockman's.如果算法已存在于标准库中,则无需手工制作并重新发明轮子. (2认同)
  • OP已经声明"Java中已经存在某种已经内置的功能",因此他的目标是确切地知道这是什么"功能".只发布一个与实际问题没什么关系的答案是没有意义的.如果有人要求自定义实现,你的答案是合理的,在这种情况下它不是. (2认同)

Art*_*gio 12

这是一个低级解决方案:

import java.util.Scanner;

public class class1 {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String inpStr = in.nextLine();
        System.out.println("Original String :" + inpStr);
        char temp;
        char[] arr = inpStr.toCharArray();
        int len = arr.length;
        for(int i=0; i<(inpStr.length())/2; i++,len--){
            temp = arr[i];
            arr[i] = arr[len-1];
            arr[len-1] = temp;
        }

        System.out.println("Reverse String :" + String.valueOf(arr));
    }
}
Run Code Online (Sandbox Code Playgroud)


Enr*_*rin 12

我尝试使用Stack,只是为了好玩.这是我的代码:

public String reverseString(String s) {
    Stack<Character> stack = new Stack<>();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
        stack.push(s.charAt(i));
    }
    while (!stack.empty()) {
        sb.append(stack.pop());
    }
    return sb.toString();

}
Run Code Online (Sandbox Code Playgroud)


小智 12

使用charAt()方法

String name = "gaurav";
String reversedString = "";
    
for(int i = name.length() - 1; i >= 0; i--){
    reversedString += name.charAt(i);
}

System.out.println(reversedString);
Run Code Online (Sandbox Code Playgroud)

使用toCharArray()方法

String name = "gaurav";
char [] stringCharArray = name.toCharArray();
String reversedString = "";
    
for(int i = stringCharArray.length - 1; i >= 0; i--) {
    reversedString += stringCharArray[i];
}

System.out.println(reversedString);
Run Code Online (Sandbox Code Playgroud)

StringBuilder的使用reverse()方法

String name = "gaurav";
    
String reversedString = new StringBuilder(name).reverse().toString();
    
System.out.println(reversedString);
Run Code Online (Sandbox Code Playgroud)

检查https://coderolls.com/reverse-a-string-in-java/


Pra*_*shi 11

由于未列出以下方法(使用XOR)来反转字符串,因此我附加此方法以反转字符串.

算法是基于:

1.(XOR B)XOR B = A.

2.(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]);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

输出:

keetarp


ide*_*all 7

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

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"));
}
Run Code Online (Sandbox Code Playgroud)


小智 6

最少的行代码非常简单

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));
            }
    }
}
Run Code Online (Sandbox Code Playgroud)