Javaで文字列を逆にする


467

"Hello World"という名前の文字列変数を保持していますhi

印刷する必要がありますが、裏返しました。

これどうやってするの?それを実行する関数がすでにJavaに組み込まれていることを理解しています。

関連:「Hello World」文字列の個々の単語をJavaで逆にします


7
@JRLは実際には文字列である必要がありますih = "dlroW olleH"; System.out.println(ih);
Matthew Farwell、2011

4
私は(重複として)近い投票を撤回できればいいのですが。私は他の質問をもう一度読んで、これが微妙に違うことに気づきました。ただし、この質問は依然としてサイト全体で何度も繰り返されています。おそらく、これをだまされたものとしてマークするための別の質問を見つける必要があります。
Rob Hruska、2011

StringBuilderクラスのreverse()関数、toCharArray()メソッド、文字の交換などを使用できます。その他の例については、このリソースを参照してください。flowerbrackets.com/ 2
Shiva

StringBuilder.reverse()は、より読みやすくエレガンスなソリューションです。
ロケシュ

回答:


980

あなたはこれを使うことができます:

new StringBuilder(hi).reverse().toString()

または、JDK 1.5より前のバージョンでは、java.util.StringBuffer代わりにを使用しますStringBuilder—それらは同じAPIを持っています。StringBuilder同時実行の懸念がない場合は、現在のところ推奨されていることを指摘してくれた解説者に感謝します。


13
「StringBuilderが最近好まれていることを指摘してくれたコメンテーターに感謝します」?スレッドの安全性が懸念される場合は、StringBufferを使用するという明確なステートメントがあります。それ以外の場合は、StringBuilderを使用できます。StringBuilderはStringBufferの代わりにはなりません。
ha9u63ar

15
@ ha9u63arローカルスローアウェイのStringBuilder同時実行を伴うこのシナリオでは、問題はありません(そして私はそれが彼の意図したことだと思います)。
xehpuk 2015年

2
2つの違いを正確に知るためのリンクは次のとおりです。javatpoint.com / …つまり 、StringBuilderはStringBuffer よりも効率的です。これはスレッドセーフではありません。つまり、複数のスレッドが同時にStringBuilderのメソッドを呼び出すことができます。
Vishnu Narang 2017

これは、文字を組み合わせる場合を除き、BMP外のUnicode文字では機能しません。
nau

2
@ダニエル・ブロックマン、素敵で簡潔な答えをありがとう。ここでOPは、「Hello World」をhiという名前の文字列変数に保持していると述べました。つまりString hi = "Hello World";。だから私はあなたの答えでは二重引用符があってはいけないと思いますhi。私はそれがこのようであるべきであることを意味しますnew StringBuilder(hi).reverse().toString()
Md。Abu Nafee Ibna Zahid

109

以下のためのオンライン裁判官の問題許可していないStringBuilderStringBuffer、あなたがそれを行うことができます場所で使用して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);
}

ただメモ。これは、2バイトを占める「文字」の場合、ひどく失敗します。
Minas Mina

実際には、通常、2バイトを占めるほとんどの文字で正常に機能します。実際に失敗するのは、UTF-16で2 x 16ビットのコード単位を占めるU​​nicodeコードポイントです。
スティーブンC

これは良い解決策ですが、最小限の複雑さで文字列に10k文字がある場合も同じようにできます。
Jatinder Kumar

62
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();
}

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


4
良い解決策(1+)。1つの拡張機能-StringBuilder(java5以降)はStringBufferよりも高速になります。よろしく。
のMichałŠrajer

31
これは、Unicodeの一部の「文字」がサロゲートペア、つまり2つのJava文字で表されることを考慮に入れていないため、一般的なケースでは機能しません。このソリューションでは、ペアの順序が間違っています。:StringBuilderの逆の方法は、Javadocを係る微細であるべきであるdocs.oracle.com/javase/7/docs/api/java/lang/...
イアン・フェアマン

59
String string="whatever";
String reverse = new StringBuffer(string).reverse().toString();
System.out.println(reverse);

7
それの複雑さは何ですか?O(N)以上?Nは文字列の長さに等しい。
Mukit09 2015

O(n)は、文字列の文字を少なくとも1回反復する必要があるためです。
PlsWork 2017

26

これを行うには、次の2つの方法を使用します。

文字で文字列を反転:

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

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

19

StringBufferの下のJava 6 APIを見てください。

String s = "sample";
String result = new StringBuffer(s).reverse().toString();

これはStringBuilderより優れていますか?
CamHart 2017

@CamHartいいえ、遅いですが、おそらくほんの少しだけです。
jcsahnwaldtは、GoFundMonicaの2018

1
ほぼ1億回のメソッド呼び出しの小さなベンチマークは、StringBufferとStringBuilderの間に大きな違いを示しました:stackoverflow.com/questions/355089/…しかし、この場合、呼び出しは2つ(reverse()toString())しかないため、違いはおそらくないでしょう測定可能。
jcsahnwaldtは、GoFundMonicaの2018

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

2
特に、@ DanielBrockmanの答えはすでにはるかに優れています。アルゴリズムが標準ライブラリにすでに存在する場合は、アルゴリズムを手作りしてホイールを再発明する必要はありません。
Willi Mentzel、2014年

14
「はるかに良い答え」の概念は主観的です。これはまさに誰かが探しているものかもしれません。
C0D3LIC1OU5 2014年

2
OPは「Javaにすでに組み込まれている、ある種の関数がある」とすでに述べているため、彼の目標は、これがどの「関数」かを正確に知ることでした。実際の質問とはほとんど関係のない回答を投稿するだけでは意味がありません。誰かがカスタム実装を要求した場合、あなたの答えは正当化されますが、この場合はそうではありません。
Willi Mentzel 2014年

反対票。他のほとんどのソリューションはO(n)であり、ほぼすべての長さの文字列を処理できます。これはO(n ^ 2)であり、約5000文字を超える文字列に対してStackOverflowErrorでクラッシュする傾向があります(JDK 8 VMでは、デフォルトの構成) 。
jcsahnwaldtは、GoFundMonicaの2018

1.他のソリューションは再帰を使用せず、長い文字列をうまく処理できます。このようなタスクに、反復ではなく再帰を使用するのはなぜですか?意味がない。(関数型プログラミングのバックグラウンドから来ている場合を除き、命令型/ OO言語でコードを記述しているときに問題が発生することがよくあります。)2.文字列連結(その無害な小さな「+」)はO(n)です。あなたはJavaに不慣れでなければなりません、そうでなければあなたはそれを知っています。
jcsahnwaldtは、GoFundMonicaの2018

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

12

私はスタックを使用して、ただの楽しみのために試してみました。ここに私のコード:

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();

}

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

}

出力:

キータルプ


8

他の人が指摘したように、好ましい方法は以下を使用することです:

new StringBuilder(hi).reverse().toString()

しかし、これを自分で実装したい場合は、残りの応答に欠陥があると思います。

その理由は、可変長エンコーディング(UTF-16)に従って配列にエンコードされたUnicodeポイントのStringリストを表すためです。char[]

つまり、一部のコードポイントは配列の1つの要素(1つのコード単位)を使用しますが、他の2つはそれらの2つを使用するため、1つの単位として処理する必要のある文字のペアが存在する可能性があります(連続する「高」および「低」サロゲート)。 。

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特殊記号を組み合わせた処理している行方不明
ルネ・

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

これを今から書くつもりでした。あなたはすでにそれを書いたことがわかりました!
ジェンシー、

4

これは私のためのトリックをしました

public static void main(String[] args) {

    String text = "abcdefghijklmnopqrstuvwxyz";

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

4

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. StringBuilderを使用:

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

または

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

3
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);

この方法を使用して、名前を逆に小文字に変換しました。


2
    public String reverse(String s) {

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

        return reversedString;
    }

この場合も、サロゲートペアは破損します。
HyperNeutrino 2015年

@JamesSmithこれについて詳しく教えていただけますか?
Dom Shahbazi

1
一部のUnicode文字は2つの文字で構成されています。これら2つを入れ替えると、文字列が破損します。また、見落とされがちなエラーの1つは正規表現です。
HyperNeutrino 2015年

2

aを逆にする自然な方法の1つStringは、a 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

上記のすべての解決策は良すぎますが、ここでは再帰的プログラミングを使用して逆ストリングを作成しています。

これは、逆ストリングを実行する再帰的な方法を探している人に役立ちます。

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

}

}

2

手順:

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


1

public String reverseWords(String s){

    String reversedWords = "";

    if(s.length()<=0) {
        return reversedWords;
    }else if(s.length() == 1){
        if(s == " "){
            return "";
        }
        return s;
    }

    char arr[] = s.toCharArray();
    int j = arr.length-1;
    while(j >= 0 ){
        if( arr[j] == ' '){
            reversedWords+=arr[j];
        }else{
            String temp="";
            while(j>=0 && arr[j] != ' '){
                temp+=arr[j];
                j--;
            }
            j++;
            temp = reverseWord(temp);
            reversedWords+=temp;
        }
        j--;

    }

    String[] chk = reversedWords.split(" ");

    if(chk == null || chk.length == 0){
        return "";
    }

    return reversedWords;



}

public String reverseWord(String s){

    char[] arr = s.toCharArray();

    for(int i=0,j=arr.length-1;i<=j;i++,j--){
        char tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
    return String.valueOf(arr);

}

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.acceptedの文字列バッファクラスを使用する方法の1つです。古いバージョンのJDKでは使用できないdiffクラスを使用して逆にする方法です。
Anurag Goel 2014年

1
public void reverString(){
System.out.println("Enter value");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
 try{

  String str=br.readLine();
  char[] charArray=str.toCharArray();
  for(int i=charArray.length-1; i>=0; i--){
   System.out.println(charArray[i]);
  }
  }
   catch(IOException ex){
  }

1

再帰:

 public String stringReverse(String string) {
    if (string == null || string.length() == 0) {
        return string;
    }
    return stringReverse(string.substring(1)) + string.charAt(0);
 }

1

楽しみのためだけに.. :)

Algorithm (str,len)
char reversedStr[] =new reversedStr[len]

iを0からlen / 2にトラバースし、次に

reversedStr[i]=str[len-1-i]  
reversedStr[len-1=i]=str[i]
return reversedStr;

時間の複雑さ:O(n)

空間の複雑さ:O(n)

public class Reverse {
    static char reversedStr[];

    public static void main(String[] args) {
        System.out.println(reversestr("jatin"));
    }


    private static String reversestr(String str) {
        int strlen = str.length();
        reversedStr = new char[strlen];

        for (int i = 0; i <= strlen / 2; i++) {
            reversedStr[i] = str.charAt(strlen - 1 - i);
            reversedStr[strlen - 1 - i] = str.charAt(i);

        }
        return new String(reversedStr);
    }

}

1
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;
}

1
    public static void reverseString(String s){
        System.out.println("---------");
        for(int i=s.length()-1; i>=0;i--){
            System.out.print(s.charAt(i));    
        }
        System.out.println(); 

    }

これは、文字列のcharを1つずつ出力するだけです。また、プログラムのどこでも使用できません。文字列変数を作成し、「char」を1つずつ文字列に挿入してから、文字列を返す方がはるかに優れています。
ゾンビちびXD

1
    //Solution #1 -- Using array and charAt()
    String name = "reverse"; //String to reverse
    Character[] nameChar =  new Character[name.length()]; // Declaring a character array with length as length of the String which you want to reverse.
    for(int i=0;i<name.length();i++)// this will loop you through the String
    nameChar[i]=name.charAt(name.length()-1-i);// Using built in charAt() we can fetch the character at a given index. 
    for(char nam:nameChar)// Just to print the above nameChar character Array using an enhanced for loop
    System.out.print(nam);


    //Solution #2 - Using StringBuffer and reverse ().
    StringBuffer reverseString = new StringBuffer("reverse");
    System.out.println(reverseString.reverse()); //reverse () Causes the character sequence to be replaced by the reverse of the sequence.

@Dharmanの応答に感謝します。説明ともう1つの解決策を追加しました。
abhi

0
package logicprogram;
import java.io.*;

public class Strinrevers {
public static void main(String args[])throws IOException
{
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("enter data");
    String data=br.readLine();
    System.out.println(data);
    String str="";
    char cha[]=data.toCharArray();

    int l=data.length();
    int k=l-1;
    System.out.println(l);


    for(int i=0;k>=i;k--)
    {

        str+=cha[k];


    }
    //String text=String.valueOf(ch);
    System.out.println(str);

}

}

0
import java.util.Scanner;

public class Test {

    public static void main(String[] args){
        Scanner input = new Scanner (System.in);
        String word = input.next();
        String reverse = "";
        for(int i=word.length()-1; i>=0; i--)
            reverse += word.charAt(i);
        System.out.println(reverse);        
    }
}

単純なforループを使用したい場合!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.