Invertir una cadena en Java


467

He "Hello World"mantenido en una variable de cadena llamada hi.

Necesito imprimirlo, pero al revés.

¿Cómo puedo hacer esto? Entiendo que hay algún tipo de función ya incorporada en Java que hace eso.

Relacionado: Invierta cada palabra individual de la cadena "Hello World" con Java


77
@JRL realmente debería ser String ih = "dlroW olleH"; System.out.println (ih);
Matthew Farwell

44
Desearía poder retirar mi voto cercano (como duplicado). Volví a leer la otra pregunta y me di cuenta de que es sutilmente diferente a esta. Sin embargo, esta pregunta todavía se duplica muchas veces en todo el sitio. Probablemente debería encontrar una pregunta diferente para marcar esto como un tonto.
Rob Hruska

puede usar la función reverse () de la clase StringBuilder, el método toCharArray (), el intercambio de caracteres y muchos más. consulte este recurso para obtener más ejemplos, flowerbrackets.com/2-best-ways-to-reverse-a-string-in-java
Shiva

StringBuilder.reverse () es una solución más legible y elegante.
lokesh

Respuestas:


980

Puedes usar esto:

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

O, para versiones anteriores a JDK 1.5, use en java.util.StringBufferlugar de StringBuilder- tienen la misma API. Gracias comentaristas por señalar que StringBuilderse prefiere hoy en día cuando no hay preocupación de concurrencia.


13
¿"Gracias comentaristas por señalar que StringBuilder es preferido hoy en día"? Hay una declaración clara de que StringBuffer si la seguridad de subprocesos es una preocupación. de lo contrario, se puede usar StringBuilder. StringBuilder no es un reemplazo para StringBuffer.
ha9u63ar

15
@ ha9u63ar Para este escenario con una StringBuilderconcurrencia local desechable no es una preocupación (y creo que eso es lo que quiso decir).
xehpuk

2
Aquí está el enlace para saber la diferencia exacta entre los dos: javatpoint.com/… en resumen: StringBuilder es más eficiente que StringBuffer. No es seguro para subprocesos, es decir, varios subprocesos pueden invocar simultáneamente métodos de StringBuilder.
Vishnu Narang

Esto no funcionará para caracteres Unicode fuera de BMP, siempre que combine caracteres.
nau

2
@Daniel Brockman, gracias por su amable y concisa respuesta. Aquí OP dijo, tengo "Hello World" guardado en una variable de cadena llamada hola . Eso significa String hi = "Hello World";. Así que creo que en su respuesta no debería no ser las comillas dobles alrededor hi. Quiero decir que debería ser asínew StringBuilder(hi).reverse().toString()
Md. Abu Nafee Ibna Zahid

109

Para los problemas de Jueces en línea que no permiten StringBuildero StringBuffer, puede hacerlo en su lugar usando char[]lo siguiente:

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. Esto fallará horriblemente para los "personajes" que ocupan dos bytes.
Minas Mina

En realidad, normalmente funciona bien para la mayoría de los caracteres que ocupan 2 bytes. Lo que realmente falla es puntos de código Unicode que ocupan unidades de código de 2 x 16 bits (en UTF-16).
Stephen C

Esta es una buena solución, pero podemos hacer lo mismo si tenemos 10k caracteres en cadena con mínima complejidad.
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


44
Buena solución (1+). Una mejora: StringBuilder (desde java5) será más rápido que StringBuffer. Saludos.
Michał Šrajer

31
Esto no funcionará en el caso general, ya que no tiene en cuenta que algunos "caracteres" en Unicode están representados por un par sustituto, es decir, dos caracteres Java, y esta solución hace que el par esté en el orden incorrecto. El método inverso de StringBuilder debería estar bien de acuerdo con JavaDoc
Ian Fairman

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

77
¿Cuál es la complejidad de esto? O (N) o más? N es igual a la longitud de la cadena.
Mukit09

O (n) ya que tiene que recorrer los caracteres de la cadena al menos una vez.
PlsWork

26

Estoy haciendo esto usando las siguientes dos formas:

Cadena inversa por PERSONAJES:

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

Cadena inversa por PALABRAS:

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

Echa un vistazo a la API de Java 6 en StringBuffer

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

¿Es esto mejor que StringBuilder?
CamHart

@CamHart No, es más lento, pero probablemente solo un poquito.
jcsahnwaldt dice GoFundMonica

1
Un pequeño punto de referencia con casi 100 millones de llamadas a métodos mostró una diferencia significativa entre StringBuffer y StringBuilder: stackoverflow.com/questions/355089/… Pero en este caso, solo hay dos llamadas ( reverse()y toString()), por lo que la diferencia probablemente ni siquiera será mensurable.
jcsahnwaldt dice GoFundMonica

17

Aquí hay un ejemplo usando recursividad:

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
Ya hay respuestas mucho mejores, especialmente @ DanielBrockman. Si ya existe un algoritmo en una biblioteca estándar, no hay necesidad de fabricarlo a mano y reinventar la rueda.
Willi Mentzel

14
Un concepto de "respuesta mucho mejor" es subjetivo. Esto puede ser exactamente lo que alguien está buscando.
C0D3LIC1OU5

2
El OP ya declaró que "hay algún tipo de función ya incorporada en Java que hace eso", por lo que su objetivo era saber exactamente qué "función" es. Simplemente publicar una respuesta que tiene poco que ver con la pregunta real no tiene sentido. Si alguien solicitara una implementación personalizada, su respuesta estaría justificada, en este caso no lo es.
Willi Mentzel

Voto a favor. La mayoría de las otras soluciones son O (n) y pueden manejar cadenas de casi cualquier longitud, esta es O (n ^ 2) y tiende a bloquearse con un StackOverflowError para cadenas de más de aproximadamente 5000 caracteres (en JDK 8 VM, configuración predeterminada) .
jcsahnwaldt dice GoFundMonica

1. Las otras soluciones no usan recursividad y pueden manejar cadenas largas muy bien. ¿Por qué usaría la recursión en lugar de la iteración para una tarea como esta? No tiene sentido. (A menos que provenga de un entorno de programación funcional, lo que a menudo genera problemas cuando escribe código en un lenguaje imperativo / OO). 2. La concatenación de cadenas (ese inocente '+') es O (n). Debes ser nuevo en Java, de lo contrario lo sabrías.
jcsahnwaldt dice GoFundMonica

12

Aquí hay una solución de bajo nivel:

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

Lo intenté, solo por diversión, usando una pila. Aquí mi código:

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

Dado que el método siguiente (usando XOR ) para invertir una cadena no está en la lista, adjunto este método para invertir una cadena.

El algoritmo se basa en:

1. (A XOR B) XOR B = A

2. (A XOR B) XOR A = B

Fragmento de código:

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

}

Salida:

keetarp


8

Como otros han señalado, la forma preferida es usar:

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

Pero si desea implementar esto usted mismo, me temo que el resto de las respuestas tienen fallas.

La razón es que Stringrepresenta una lista de puntos Unicode , codificados en una char[]matriz de acuerdo con la codificación de longitud variable: UTF-16 .

Esto significa que algunos puntos de código usan un solo elemento de la matriz (una unidad de código) pero otros usan dos de ellos, por lo que puede haber pares de caracteres que deben tratarse como una sola unidad (sustitutos "altos" y "bajos" consecutivos) .

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

Buena solución, solo falta una parte ahora es el manejo de la combinación de diacríticos :-D
René

6

Es muy simple en código mínimo de líneas.

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

Iba a escribir esto ahora ... ¡Descubrí que ya lo has escrito!
Jency

4

Esto hizo el truco para mí

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. Usando la matriz de caracteres:

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

Usé este método para convertir los nombres al revés y en minúsculas.


2
    public String reverse(String s) {

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

        return reversedString;
    }

De nuevo, los pares sustitutos se corromperán de esta manera.
HyperNeutrino

@JamesSmith, ¿podría ampliar esto, por favor?
Dom Shahbazi

1
Algunos caracteres unicode consisten en dos caracteres; Si estos dos se cambian, la cadena está dañada. Además, un error comúnmente pasado por alto es regex.
HyperNeutrino

2

Una forma natural de revertir a Stringes usar a StringTokenizery a stack. Stackes una clase que implementa una pila de objetos de último en entrar, primero en salir (LIFO) fácil de usar.

String s = "Hello My name is Sufiyan";

Ponlo en la pila al frente

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

Imprime la pila al revés

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

Esto no responde la pregunta.
Ryan

2

Toda la solución anterior es demasiado buena, pero aquí estoy haciendo una cadena inversa usando programación recursiva.

Esto es útil para quién está buscando una forma recursiva de hacer una cadena 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

Procedimiento:

Podemos usar split () para dividir la cadena. Luego use el bucle inverso y agregue los caracteres.


Fragmento de código:

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

También puedes probar esto:

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
Hay muchos métodos para revertir una cadena. Este es uno de ellos que usa la clase stringbuffer de java. La respuesta aceptada es usar la clase diff para revertir, que no está disponible en la versión anterior de 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

recursividad

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

1

Solo por diversión..:)

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

Atraviese i de 0 a len / 2 y luego

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

Complejidad de tiempo: O (n)

Complejidad espacial: 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(); 

    }

Esto solo genera caracteres de la cadena uno por uno. Y tampoco se puede usar en ninguna parte del programa. Es mucho mejor crear una variable de cadena, inserte el "char" uno por uno en la cadena, luego devuelva la cadena.
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 gracias por la respuesta. Explicación agregada y una solución más.
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);        
    }
}

Si quieres usar un simple for loop!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.