Kehren Sie eine Zeichenfolge in Java um


467

Ich habe "Hello World"in einer String-Variablen namens hi.

Ich muss es drucken, aber umgekehrt.

Wie kann ich das machen? Ich verstehe, dass es eine Art Funktion gibt, die bereits in Java integriert ist und dies tut.

Verwandte: Kehren Sie jedes einzelne Wort der Zeichenfolge "Hello World" mit Java um


7
@JRL sollte wirklich String sein ih = "dlroW olleH"; System.out.println (ih);
Matthew Farwell

4
Ich wünschte, ich könnte meine enge Abstimmung zurückziehen (als Duplikat). Ich habe die andere Frage noch einmal gelesen und festgestellt, dass sie sich auf subtile Weise von dieser unterscheidet. Diese Frage wird jedoch auf der gesamten Website immer noch mehrfach dupliziert. Wahrscheinlich sollte man nur eine andere Frage finden, um dies als Betrug zu markieren.
Rob Hruska

Sie können die reverse () - Funktion der StringBuilder-Klasse, die toCharArray () -Methode, das Austauschen von Zeichen und vieles mehr verwenden. Weitere Beispiele finden Sie in dieser Ressource. Flowerbrackets.com/2-best-ways-to-reverse-a-string-in-java
Shiva

StringBuilder.reverse () ist eine besser lesbare und elegante Lösung.
Lokesh

Antworten:


980

Sie können dies verwenden:

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

Oder verwenden Sie für Versionen vor JDK 1.5 java.util.StringBufferanstelle von StringBuilder- sie haben dieselbe API. Vielen Dank an die Kommentatoren für den Hinweis, dass dies StringBuilderheutzutage bevorzugt wird, wenn keine Bedenken hinsichtlich der Parallelität bestehen.


13
"Vielen Dank an die Kommentatoren für den Hinweis, dass StringBuilder heutzutage bevorzugt wird"? Es gibt eine klare Aussage, dass StringBuffer, wenn Thread-Sicherheit ein Problem ist. Andernfalls kann StringBuilder verwendet werden. StringBuilder ist kein Ersatz für StringBuffer.
ha9u63ar

15
@ ha9u63ar Für dieses Szenario mit einer lokalen Wegwerf- StringBuilderParallelität ist das kein Problem (und ich denke, das hat er gemeint).
Xehpuk

2
Hier ist der Link, um den genauen Unterschied zwischen den beiden zu kennen: javatpoint.com/… kurz: StringBuilder ist effizienter als StringBuffer. Es ist nicht threadsicher, dh mehrere Threads können gleichzeitig Methoden von StringBuilder aufrufen.
Vishnu Narang

Dies funktioniert nicht für Unicode-Zeichen außerhalb von BMP, solange Zeichen kombiniert werden.
Nau

2
@ Daniel Brockman, vielen Dank für Ihre nette und prägnante Antwort. Hier sagte OP, ich habe "Hello World" in einer String-Variablen namens hi gespeichert . Das heißt String hi = "Hello World";. Also habe ich in Ihrer Antwort denken , sollte es nicht irgendwelche doppelte Anführungszeichen sein hi. Ich meine, es sollte so seinnew StringBuilder(hi).reverse().toString()
Md. Abu Nafee Ibna Zahid

109

Für Online Richter Probleme , mit denen nicht StringBuilderoder StringBufferkönnen Sie es tun , an Ort und Stelle mit , char[]wie folgend:

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

Nur eine Anmerkung. Dies wird für "Zeichen", die zwei Bytes belegen, schrecklich fehlschlagen.
Minas Mina

Tatsächlich funktioniert es normalerweise gut für die meisten Zeichen, die 2 Bytes belegen. Was tatsächlich fehlschlägt, sind Unicode-Codepunkte, die 2 x 16-Bit-Codeeinheiten belegen (in UTF-16).
Stephen C

Dies ist eine gute Lösung, aber wir können dasselbe tun, wenn wir 10.000 Zeichen in einer Zeichenfolge mit minimaler Komplexität haben.
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
Gute Lösung (1+). Eine Verbesserung - StringBuilder (seit java5) ist schneller als StringBuffer. Grüße.
Michał Šrajer

31
Dies funktioniert im allgemeinen Fall nicht, da nicht berücksichtigt wird, dass einige "Zeichen" in Unicode durch ein Ersatzpaar dargestellt werden, dh zwei Java-Zeichen, und diese Lösung führt dazu, dass das Paar in der falschen Reihenfolge ist. Die umgekehrte Methode von StringBuilder sollte laut JavaDoc in Ordnung sein: docs.oracle.com/javase/7/docs/api/java/lang/…
Ian Fairman

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

7
Was ist die Komplexität davon? O (N) oder mehr? N ist gleich der Länge der Zeichenkette.
Mukit09

O (n), da es mindestens einmal durch die Zeichen der Zeichenfolge iterieren muss.
PlsWork

26

Ich mache das auf zwei Arten:

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

Reverse String von 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

Schauen Sie sich die Java 6-API unter StringBuffer an

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

ist das besser als StringBuilder?
CamHart

@ CamHart Nein, es ist langsamer, aber wahrscheinlich nur ein kleines bisschen.
Jcsahnwaldt sagt GoFundMonica

1
Ein kleiner Benchmark mit fast 100 Millionen Methodenaufrufen zeigte einen signifikanten Unterschied zwischen StringBuffer und StringBuilder: stackoverflow.com/questions/355089/… In diesem Fall gibt es jedoch nur zwei Aufrufe ( reverse()und toString()), sodass der Unterschied wahrscheinlich nicht einmal sein wird messbar.
Jcsahnwaldt sagt GoFundMonica

17

Hier ist ein Beispiel mit Rekursion:

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
Es gibt bereits weitaus bessere Antworten, insbesondere bei DanielBrockman. Wenn in einer Standardbibliothek bereits ein Algorithmus vorhanden ist, muss dieser nicht von Hand hergestellt und das Rad neu erfunden werden.
Willi Mentzel

14
Ein Konzept "weitaus bessere Antwort" ist subjektiv. Dies kann genau das sein, wonach jemand sucht.
C0D3LIC1OU5

2
Das OP gab bereits an, dass "es eine Art bereits in Java integrierte Funktion gibt, die dies tut", und sein Ziel war es, genau zu wissen, um welche "Funktion" es sich handelt. Nur eine Antwort zu veröffentlichen, die wenig mit der tatsächlich gestellten Frage zu tun hat, ist unsinnig. Wenn jemand nach einer benutzerdefinierten Implementierung fragen würde, wäre Ihre Antwort gerechtfertigt, in diesem Fall nicht.
Willi Mentzel

Downvote. Die meisten anderen Lösungen sind O (n) und können Zeichenfolgen mit nahezu beliebiger Länge verarbeiten. Diese ist O (n ^ 2) und stürzt mit einem StackOverflowError für Zeichenfolgen ab, die länger als etwa 5000 Zeichen sind (auf JDK 8 VM, Standardkonfiguration). .
Jcsahnwaldt sagt GoFundMonica

1. Die anderen Lösungen verwenden keine Rekursion und können lange Zeichenfolgen problemlos verarbeiten. Warum sollten Sie für eine solche Aufgabe Rekursion anstelle von Iteration verwenden? Das macht keinen Sinn. (Es sei denn, Sie haben einen funktionalen Programmierhintergrund, was häufig zu Problemen beim Schreiben von Code in einer imperativen / OO-Sprache führt.) 2. Die Verkettung von Zeichenfolgen (dieses unschuldige kleine '+') ist O (n). Sie müssen neu in Java sein, sonst würden Sie das wissen.
Jcsahnwaldt sagt GoFundMonica

12

Hier ist eine Low-Level-Lösung:

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

Ich habe es nur zum Spaß mit einem Stack versucht. Hier mein Code:

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

Seit der folgenden Methode (unter Verwendung von XOR ), um eine Zeichenfolge umzukehren nicht aufgeführt ist, füge ich diese Methode zum Umkehren einer Zeichenfolge hinzu.

Der Algorithmus basiert auf:

1. (A XOR B) XOR B = A.

2. (A XOR B) XOR A = B.

Code-Auszug:

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

}

Ausgabe:

Keetarp


8

Wie andere bereits betont haben, ist die bevorzugte Verwendung:

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

Aber wenn Sie dies selbst implementieren möchten, befürchte ich, dass die restlichen Antworten Mängel aufweisen.

Der Grund dafür ist, dass es sich Stringum eine Liste von Unicode- Punkten handelt, die in einem char[]Array gemäß der Codierung variabler Länge: UTF-16 codiert sind .

Dies bedeutet, dass einige Codepunkte ein einzelnes Element des Arrays (eine Codeeinheit) verwenden, andere jedoch zwei, sodass möglicherweise Zeichenpaare als einzelne Einheit behandelt werden müssen (aufeinanderfolgende "hohe" und "niedrige" Ersatzzeichen). .

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

Gute Lösung, nur ein Teil fehlt jetzt die Handhabung der Kombination von Diakritika :-D
René

6

Es ist sehr einfach in minimalen Zeilencode

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

Ich wollte das jetzt schreiben. Ich habe festgestellt, dass du es bereits geschrieben hast!
Jency

4

Das hat den Trick für mich getan

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. Verwenden des Zeichenarrays:

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. Verwenden von StringBuilder:

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

ODER

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

Ich habe diese Methode verwendet, um Namen rückwärts und in Kleinbuchstaben umzuwandeln.


2
    public String reverse(String s) {

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

        return reversedString;
    }

Auch hier werden Ersatzpaare auf diese Weise beschädigt.
HyperNeutrino

@ JamesSmith Könnten Sie das bitte erweitern?
Dom Shahbazi

1
Einige Unicode-Zeichen bestehen aus zwei Zeichen. Wenn diese beiden vertauscht werden, ist die Zeichenfolge beschädigt. Ein häufig übersehener Fehler ist Regex.
HyperNeutrino

2

Eine natürliche Möglichkeit, a umzukehren, Stringbesteht darin, a StringTokenizerund einen Stapel zu verwenden. Stackist eine Klasse, die einen benutzerfreundlichen LIFO-Stapel (Last-In, First-Out) von Objekten implementiert.

String s = "Hello My name is Sufiyan";

Legen Sie es vorne in den Stapel

Stack<String> myStack = new Stack<>();
StringTokenizer st = new StringTokenizer(s);
while (st.hasMoreTokens()) {
     myStack.push(st.nextToken());
}

Drucken Sie den Stapel rückwärts

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 Test {

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

Dies beantwortet die Frage nicht.
Ryan

2

Alle oben genannten Lösungen sind zu gut, aber hier mache ich Reverse String mit rekursiver Programmierung.

Dies ist hilfreich für diejenigen, die eine rekursive Methode zum Ausführen von Reverse-Strings suchen.

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

Vorgehensweise:

Wir können split () verwenden, um die Zeichenfolge zu teilen. Verwenden Sie dann die Umkehrschleife und fügen Sie die Zeichen hinzu.


Code-Auszug:

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

Sie können dies auch versuchen:

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
Es gibt viele Methoden zum Umkehren eines Strings. Dies ist eine davon, die die Stringbuffer-Klasse von Java verwendet. Die akzeptierte Antwort verwendet die Diff-Klasse zum Umkehren, die in älteren JDK-Versionen nicht verfügbar ist.
Anurag Goel

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

Rekursion:

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

1

Nur zum Spaß..:)

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

Durchquere i von 0 nach len / 2 und dann

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

Zeitkomplexität: O (n)

Raumkomplexität: 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(); 

    }

Dies gibt nur nacheinander char der Zeichenfolge aus. Und es kann auch nirgendwo im Programm verwendet werden. Es ist viel besser, eine String-Variable zu erstellen, das "Zeichen" einzeln in den String einzufügen und dann den String zurückzugeben.
Zombie Chibi 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 danke für die Antwort. Erklärung und eine weitere Lösung hinzugefügt.
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);        
    }
}

Wenn Sie eine einfache for-Schleife verwenden möchten!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.