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

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

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

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

Echa un vistazo a la API de Java 6 en StringBuffer

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

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

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

Stormhawks
fuente
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
fuente
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('"');
Sufiyan Ghori
fuente
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
fuente
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);

}

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

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

recursividad

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

}
jatin Goyal
fuente
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
fuente
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
fuente
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.
abhi
fuente
@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);

}

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

Apetrei Ionut
fuente