Java中反转字符串

589

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

1
    public String reverse(String s) {

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

        return reversedString;
    }

再次强调,使用这种方法会导致代理对变得损坏。 - user4157653
@JamesSmith,你能详细解释一下吗? - Dom Shahbazi
1
一些Unicode字符由两个字符组成;如果这两个字符交换位置,字符串就会损坏。此外,一个常被忽视的错误是正则表达式。 - user4157653

1
你也可以尝试这个方法:
public class StringReverse {
    public static void main(String[] args) {
        String str = "Dogs hates cats";
        StringBuffer sb = new StringBuffer(str);
        System.out.println(sb.reverse());
    }
}

1
有许多方法可以反转字符串。这是其中一种使用Java的StringBuffer类。被接受的答案是使用不在旧版JDK中可用的不同类进行反转。 - Anurag Goel

0
简短的回答是,由于“代理对”问题,Java没有提供反转字符串的通用解决方案,您必须考虑到这一点。
如果要求保证在所有Unicode和所有语言(包括威尔士语:)中都能正常工作,则必须自己编写代码。只需将字符串作为其代码点进行原地数组交换即可:
public static String reverse(String str)
{
        // You get what you ask for ;)
        if (str == null) return null;

        // str.length() is equal to the number of unicode code points in a string
        if (str.isEmpty() || str.length() == 1) return str;

        final int[] codePoints = str.codePoints().toArray();
        final int len = codePoints.length;

        // swap in place
        for(int i = 0; i < codePoints.length/2; i++)
        {
            int tmp = codePoints[i];
            codePoints[i] = codePoints[len-i-1];
            codePoints[len-i-1] = tmp;
        }

        return new String(codePoints,0,len);
}

如果您使用String.getBytes()来实现此操作,则所有字节都将被反转,这将导致所有UTF-8编码被反转,并且任何尝试使用不是int代码点的字符都将无法处理“星际平面”代码点(那些在BMP之外的代码点)。

作为一种通用解决方案,这种方法相当高效,但它非常简单,并且保证适用于任何字符串,这可能是您从“通用解决方案”中想要的。

唯一需要注意的是,如果您从UTF8/16编码的文件中读取字符串,则可能在开头有一个BOM,但这超出了问题的范围。

-Blue


0
使用apache.commons.lang3
StringUtils.reverse(hi)

0
        String str = "Hello World";

        char[] strCharArr = str.toCharArray();

        for(int i = 0, k= strCharArr.length-1;i != k; i++, k--) {
            char temp = strCharArr[i];
            strCharArr[i] = strCharArr[k];
            strCharArr[k] = temp;
        }

        System.out.println(String.valueOf(strCharArr));

0
public static String revString(String str){
    char[] revCharArr = str.toCharArray();
    for (int i=0; i< str.length()/2; i++){
        char f = revCharArr[i];
        char l = revCharArr[str.length()-i-1];
        revCharArr[i] = l;
        revCharArr[str.length()-i-1] = f;
    }
    String revStr = new String(revCharArr);
    return revStr;
}

0
还没有建议,你也可以将hi连接到一个空字符串上并反转它,像这样:
"".concat(hi).reverse()

这也是有效的JavaScript。


0

字符序列(或)字符串字符串家族

String testString = "Yashwanth@777"; // ~1 1⁄4→D800₁₆«2²⁰

使用Java 8 Stream API,首先通过使用方法CharSequence.chars()将字符串转换为流,然后使用方法IntStream.range生成数字的顺序流。然后将此流序列映射到字符串。
public static String reverseString_Stream(String str) {
    IntStream cahrStream = str.chars();
    final int[] array = cahrStream.map( x -> x ).toArray();

    int from = 0, upTo = array.length;
    IntFunction<String> reverseMapper = (i) -> ( Character.toString((char) array[ (upTo - i) + (from - 1) ]) );

    String reverseString = IntStream.range(from, upTo) // for (int i = from; i < upTo ; i++) { ... }
            .mapToObj( reverseMapper )                 // array[ lastElement ]
            .collect(Collectors.joining())             // Joining stream of elements together into a String.
            .toString();                               // This object (which is already a string!) is itself returned.

    System.out.println("Reverse Stream as String : "+ reverseString);
    return reverseString;
}

使用传统的for循环
如果您想要反转字符串,那么我们需要按照以下步骤进行操作:
- 将字符串转换为字符数组。 - 反向迭代数组,将每个字符附加到临时字符串变量,直到最后一个字符。
public static String reverseString( String reverse ) {
    if( reverse != null && reverse != "" && reverse.length() > 0 ) {

        char[] arr = reverse.toCharArray();
        String temp = "";
        for( int i = arr.length-1; i >= 0; i-- ) {
            temp += arr[i];
        }
        System.out.println("Reverse String : "+ temp);
    }
    return null;
}

使用StringBuffer或StringBuilder类提供的reverse方法是一种简单易用的方式。
StringBuilder和StringBuffer是可变字符序列。这意味着可以更改这些对象的值。
StringBuffer buffer = new StringBuffer(str);
System.out.println("StringBuffer - reverse : "+ buffer.reverse() );

String builderString = (new StringBuilder(str)).reverse().toString;
System.out.println("StringBuilder generated reverse String : "+ builderString  );

StringBuffer具有与StringBuilder相同的方法,但StringBuffer中的每个方法都是同步的,因此它是线程安全的。


0

Java中的简单For循环

 public void reverseString(char[] s) {
    int length = s.length;
    for (int i = 0; i < s.length / 2; i++) {
        // swaping character
        char temp = s[length - i - 1];
        s[length - i - 1] = s[i];
        s[i] = temp;
    }
}

0
以下解决方案对我起了作用。
public class ReverseString {
public static void reverseString(char[] s) {
    int i = 0;
    int j = s.length - 1;

    while (i < j) {
        char temp = s[i];
        s[i] = s[j];
        s[j] = temp;
        i++;
        j--;
    }
}

public static void main(String[] args) {
    char[] input = {'h', 'e', 'l', 'l', 'o'};
    reverseString(input);
    System.out.println(new String(input)); // Output: "olleh"
}

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