Invertire una stringa in Java


467

Ho "Hello World"tenuto in una variabile String denominata hi.

Devo stamparlo, ma al contrario.

Come posso fare questo? Capisco che esiste una sorta di funzione già integrata in Java che lo fa.

Correlati: inverte ogni singola parola della stringa "Hello World" con Java


7
@JRL dovrebbe davvero essere String ih = "dlroW olleH"; System.out.println (IH);
Matthew Farwell,

4
Vorrei poter ritirare il mio voto ravvicinato (come duplicato). Ho riletto l'altra domanda e mi sono reso conto che è leggermente diverso da questo. Tuttavia, questa domanda è ancora duplicata più volte sul sito. Probabilmente dovrebbe solo trovare una domanda diversa per contrassegnare questo come un inganno.
Rob Hruska,

puoi usare la funzione reverse () della classe StringBuilder, il metodo toCharArray (), lo scambio di caratteri e molti altri. fare riferimento a questa risorsa per ulteriori esempi, flowerbrackets.com/2-best-ways-to-reverse-a-string-in-java
Shiva,

StringBuilder.reverse () è la soluzione più leggibile ed elegante.
lokesh,

Risposte:


980

Puoi usare questo:

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

Oppure, per le versioni precedenti a JDK 1.5, utilizzare java.util.StringBufferinvece di StringBuilder: hanno la stessa API. Grazie ai commentatori per aver sottolineato che StringBuilderè preferibile al giorno d'oggi quando non vi è alcun problema di concorrenza.


13
"Grazie ai commentatori per aver sottolineato che StringBuilder è preferito al giorno d'oggi"? C'è una chiara dichiarazione che StringBuffer se la sicurezza dei thread è un problema. in caso contrario, è possibile utilizzare StringBuilder. StringBuilder non sostituisce StringBuffer.
ha9u63ar,

15
@ ha9u63ar Per questo scenario con una StringBuilderconcorrenza usa e getta locale non è un problema (e penso che sia quello che intendeva dire).
xehpuk,

2
Ecco il link per conoscere la differenza esatta tra i due: javatpoint.com/… in breve: StringBuilder è più efficiente di StringBuffer. Non è thread-safe, ovvero più thread possono chiamare contemporaneamente metodi di StringBuilder.
Vishnu Narang,

Questo non funzionerà per i caratteri Unicode al di fuori di BMP, purché per la combinazione di caratteri.
nau,

2
@Daniel Brockman, grazie per la tua bella e concisa risposta. Qui OP ha detto, ho "Hello World" tenuto in una variabile String chiamata hi . Questo significa String hi = "Hello World";. Quindi penso che la tua risposta ci dovrebbe non esserci doppi apici intorno hi. Voglio dire, dovrebbe essere cosìnew StringBuilder(hi).reverse().toString()
Md. Abu Nafee Ibna Zahid,

109

Per i problemi dei giudici online che non consentono StringBuildero StringBuffer, puoi farlo sul posto usando char[]come segue:

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

Solo una nota però. Questo fallirà in modo orribile per i "personaggi" che occupano due byte.
Minas Mina,

In realtà, in genere funziona bene per la maggior parte dei caratteri che occupano 2 byte. Ciò che effettivamente non riesce sono i punti di codice Unicode che occupano 2 codeunits a 16 x 16 bit (in UTF-16).
Stephen C,

Questa è una buona soluzione, ma possiamo fare lo stesso se abbiamo 10k caratteri in stringa con una complessità minima.
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
Buona soluzione (1+). Un miglioramento: StringBuilder (da java5) sarà più veloce di StringBuffer. Saluti.
Michał Šrajer,

31
Questo non funzionerà nel caso generale poiché non tiene conto del fatto che alcuni "caratteri" in Unicode sono rappresentati da una coppia surrogata, ovvero due caratteri Java, e questa soluzione fa sì che la coppia sia nell'ordine sbagliato. Il metodo inverso di StringBuilder dovrebbe andare bene secondo JavaDoc: 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
Qual è la complessità di esso? O (N) o più? N è uguale alla lunghezza della stringa.
Mukit09,

O (n) poiché deve scorrere almeno una volta i caratteri della stringa.
PlsWork,

26

Lo sto facendo usando i seguenti due modi:

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

Stringa inversa di 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

Dai un'occhiata all'API Java 6 in StringBuffer

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

è meglio di StringBuilder?
CamHart

@CamHart No, è più lento, ma probabilmente solo un pochino.
jcsahnwaldt dice GoFundMonica l'

1
Un piccolo benchmark con quasi 100 milioni di chiamate di metodo ha mostrato una differenza significativa tra StringBuffer e StringBuilder: stackoverflow.com/questions/355089/… Ma in questo caso, ci sono solo due chiamate ( reverse()e toString()), quindi la differenza probabilmente non sarà nemmeno misurabile.
jcsahnwaldt dice GoFundMonica l'

17

Ecco un esempio usando la ricorsione:

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
Ci sono già risposte di gran lunga migliori, specialmente quelle di DanielBrockman. Se esiste già un algoritmo in una libreria standard, non è necessario crearlo manualmente e reinventare la ruota.
Willi Mentzel,

14
Un concetto di "risposta molto migliore" è soggettivo. Questo potrebbe essere esattamente quello che qualcuno sta cercando.
C0D3LIC1OU5,

2
L'OP ha già affermato che "esiste una sorta di funzione già integrata in Java che lo fa", quindi il suo obiettivo era quello di sapere esattamente quale "funzione" fosse. Pubblicare una risposta che ha poco a che fare con la vera domanda posta non ha senso. Se qualcuno dovesse richiedere un'implementazione personalizzata la tua risposta sarebbe giustificata, in questo caso non lo è.
Willi Mentzel,

Downvote. La maggior parte delle altre soluzioni sono O (n) e possono gestire stringhe praticamente di qualsiasi lunghezza, questa è O (n ^ 2) e tende a bloccarsi con StackOverflowError per stringhe più lunghe di circa 5000 caratteri (su VM JDK 8, configurazione predefinita) .
jcsahnwaldt dice GoFundMonica

1. Le altre soluzioni non usano la ricorsione e possono gestire bene stringhe lunghe. Perché dovresti usare la ricorsione invece dell'iterazione per un'attività come questa? Non ha senso. (A meno che non provenga da un background di programmazione funzionale, che spesso porta a problemi quando si scrive codice in un linguaggio imperativo / OO.) 2. Concatenazione di stringhe (quel piccolo '+' innocente) è O (n). Devi essere nuovo a Java, altrimenti lo sapresti.
jcsahnwaldt dice GoFundMonica l'

12

Ecco una soluzione di basso livello:

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

Ho provato, solo per divertimento, usando uno Stack. Ecco il mio codice:

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

Poiché il metodo seguente (utilizzando XOR ) per invertire una stringa non è elencato, allego questo metodo per invertire una stringa.

L' algoritmo si basa su:

1. (A XOR B) XOR B = A

2. (A XOR B) XOR A = B

Snippet di codice:

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

}

Produzione:

keetarp


8

Come altri hanno sottolineato il modo preferito è usare:

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

Ma se vuoi implementarlo da solo, temo che il resto delle risposte abbia dei difetti.

Il motivo è che Stringrappresenta un elenco di punti Unicode , codificati in un char[]array in base alla codifica a lunghezza variabile: UTF-16 .

Ciò significa che alcuni punti di codice usano un singolo elemento dell'array (un'unità di codice) ma altri ne usano due, quindi potrebbero esserci coppie di caratteri che devono essere trattati come una singola unità (surrogati consecutivi "alto" e "basso") .

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

Buona soluzione, solo una parte mancante è ora la gestione della combinazione dei segni diacritici :-D
René

6

È molto semplice nel codice minimo delle righe

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

Stavo per scrivere questo ora .. Ho scoperto che l'hai già scritto!
Jency,

4

Questo ha fatto il trucco per me

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. Utilizzo dell'array di caratteri:

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. Utilizzando StringBuilder:

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

O

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

Ho usato questo metodo per trasformare i nomi all'indietro e in minuscolo.


2
    public String reverse(String s) {

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

        return reversedString;
    }

Ancora una volta, le coppie surrogate verranno corrotte in questo modo.
HyperNeutrino,

@JamesSmith potresti approfondire questo per favore?
Dom Shahbazi,

1
Alcuni personaggi unicode sono composti da due personaggi; se questi due vengono scambiati, la stringa è corrotta. Inoltre, un errore comunemente trascurato è regex.
HyperNeutrino,

2

Un modo naturale per invertire a Stringè usare StringTokenizerae uno stack. Stackè una classe che implementa una pila di oggetti last-in, first-out (LIFO) di facile utilizzo.

String s = "Hello My name is Sufiyan";

Mettilo nella pila frontalmente

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

Stampa la risma all'indietro

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

Questo non risponde alla domanda.
Ryan,

2

Tutta la soluzione sopra è troppo buona, ma qui sto facendo una stringa inversa usando la programmazione ricorsiva.

Questo è utile per chi sta cercando un modo ricorsivo di fare la stringa inversa.

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

Procedura:

Possiamo usare split () per dividere la stringa. Quindi utilizzare il ciclo inverso e aggiungere i caratteri.


Snippet di codice:

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

Puoi anche provare questo:

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
ci sono molti metodi per invertire una stringa.questo è uno di questi che usa la classe stringbuffer di java.accepted answer sta usando la classe diff per invertire che non è disponibile nella versione precedente di JDK.
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

ricorsione:

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

1

Solo per divertimento..:)

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

Attraversa i da 0 a len / 2 e poi

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

Complessità temporale: O (n)

Complessità spaziale: 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(); 

    }

Questo emette semplicemente il carattere della stringa uno alla volta. Inoltre, non può essere utilizzato in nessun punto del programma. È molto meglio creare una variabile String, inserire il "char" uno alla volta nella stringa, quindi restituire la stringa.
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 grazie per la risposta. aggiunta spiegazione e un'altra soluzione.
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);        
    }
}

Se vuoi usare un semplice ciclo per!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.