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

Ron
quelle
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.

Daniel Brockman
quelle
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);
}
Sami Eltamawy
quelle
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

Kevin Bowersox
quelle
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);
Luchian Grigore
quelle
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);
}
Vikasdeep Singh
quelle
19

Schauen Sie sich die Java 6-API unter StringBuffer an

String s = "sample";
String result = new StringBuffer(s).reverse().toString();
Andrew Briggs
quelle
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);
}
C0D3LIC1OU5
quelle
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));
    }
}
Artur Grigio
quelle
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();

}
Enrico Giurin
quelle
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

Prateek Joshi
quelle
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"));
}
idelvall
quelle
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));
            }
    }
}
Neelendra
quelle
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));
    }
}
DarkMental
quelle
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();
Avijit Karmakar
quelle
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.

Stormhawks
quelle
2
    public String reverse(String s) {

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

        return reversedString;
    }
Dom Shahbazi
quelle
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('"');
Sufiyan Ghori
quelle
2
public class Test {

public static void main(String args[]) {
   StringBuffer buffer = new StringBuffer("Game Plan");
   buffer.reverse();
   System.out.println(buffer);
 }  
}
Joby Wilson Mathews
quelle
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);

}

}
Dhiral Pandya
quelle
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

Hautausschläge
quelle
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);

}
rvd
quelle
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());
    }
}
Anurag Goel
quelle
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){
  }
Deepak Singh
quelle
1

Rekursion:

 public String stringReverse(String string) {
    if (string == null || string.length() == 0) {
        return string;
    }
    return stringReverse(string.substring(1)) + string.charAt(0);
 }
connect2krish
quelle
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);
    }

}
Jatin Goyal
quelle
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;
}
Muhammad Aasharib Nawshad
quelle
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(); 

    }
Mutlu
quelle
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.
abhi
quelle
@ 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);

}

}
kumaravel j
quelle
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!

Apetrei Ionut
quelle