Inverter uma string em Java

467

Eu "Hello World"mantive em uma variável String chamadahi .

Preciso imprimi-lo, mas invertido.

Como posso fazer isso? Eu entendo que já existe algum tipo de função embutida no Java que faz isso.

Relacionado: Inverta cada palavra individual da string "Hello World" com Java

Ron
fonte
7
@JRL realmente deve ser String ih = "dlroW olleH"; System.out.println (ih);
Matthew Farwell
4
Eu gostaria de poder retirar meu voto próximo (como duplicado). Reli a outra pergunta e percebi que é sutilmente diferente disso. No entanto, essa pergunta ainda é duplicada várias vezes no site. Provavelmente deveria apenas encontrar uma pergunta diferente para marcar isso como uma bobagem.
Rob Hruska
você pode usar a função reverse () da classe StringBuilder, o método toCharArray (), trocando caracteres e muito mais. consulte este recurso para mais exemplos, flowerbrackets.com/2-best-ways-to-reverse-a-string-in-java
Shiva
StringBuilder.reverse () é uma solução mais legível e elegível.
Lokesh 17/08/2018

Respostas:

980

Você pode usar isto:

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

Ou, para versões anteriores ao JDK 1.5, use em java.util.StringBuffervez de StringBuilder- elas têm a mesma API. Agradecemos aos comentaristas por apontarem que StringBuilderhoje é o preferido quando não há preocupação de simultaneidade.

Daniel Brockman
fonte
13
"Obrigado comentadores por apontarem que StringBuilder é o preferido hoje em dia"? Há uma declaração clara de que StringBuffer se a segurança da thread é uma preocupação. caso contrário, StringBuilder pode ser usado. StringBuilder não é um substituto para StringBuffer.
ha9u63ar
15
@ ha9u63ar Para esse cenário com uma StringBuilderconcorrência local descartável não é uma preocupação (e acho que foi isso que ele quis dizer).
xehpuk
2
Aqui está o link para saber a diferença exata entre os dois: javatpoint.com/… em resumo: StringBuilder é mais eficiente que StringBuffer. Não é seguro para threads, ou seja, vários threads podem chamar métodos do StringBuilder simultaneamente.
Vishnu Narang
Isso não funcionará para caracteres Unicode fora do BMP, desde que combinando caracteres.
nau
2
@ Daniel Brockman, obrigado pela sua resposta agradável e concisa. Aqui o OP disse, eu tenho "Hello World" mantido em uma variável String chamada hi . Isso significa String hi = "Hello World";. Então eu acho que, em sua resposta não deve não haver aspas em torno hi. Quero dizer que deveria ser assimnew StringBuilder(hi).reverse().toString()
Md. Abu Nafee Ibna Zahid 30/08/18
109

Para problemas de Juízes Online que não permitem StringBuilderou StringBuffer, você pode fazê-lo no local usando char[]o seguinte:

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
fonte
Apenas uma nota. Isso falhará horrivelmente para "caracteres" que ocupam dois bytes.
Minas Mina
Na verdade, normalmente funciona bem para a maioria dos caracteres que ocupam 2 bytes. O que realmente falha é nos pontos de código Unicode que ocupam unidades de código de 2 x 16 bits (em UTF-16).
Stephen C
Essa é uma boa solução, mas podemos fazer o mesmo se tivermos 10k caracteres em sequência com complexidade mínima.
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
fonte
4
Boa solução (1+). Um aprimoramento - StringBuilder (desde java5) será mais rápido que StringBuffer. Saudações.
Michał Šrajer 27/09/11
31
Isso não funcionará no caso geral, pois não leva em consideração que alguns "caracteres" no unicode são representados por um par substituto, ou seja, dois caracteres Java, e essa solução resulta no par na ordem errada. O método reverso do StringBuilder deve ser bom, de acordo com o 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);
Luchian Grigore
fonte
7
Qual é a complexidade disso? O (N) ou mais? N é igual ao comprimento da string.
Mukit09
O (n), pois ele precisa percorrer os caracteres da sequência pelo menos uma vez.
precisa saber é o seguinte
26

Estou fazendo isso usando as duas maneiras a seguir:

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

Inverter string por PALAVRAS:

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
fonte
19

Dê uma olhada na API Java 6 em StringBuffer

String s = "sample";
String result = new StringBuffer(s).reverse().toString();
Andrew Briggs
fonte
isso é melhor que StringBuilder?
CamHart
@CamHart Não, é mais lento, mas provavelmente apenas um pouquinho.
jcsahnwaldt disse GoFundMonica
1
Um pequeno benchmark com quase 100 milhões de chamadas de método mostrou uma diferença significativa entre StringBuffer e StringBuilder: stackoverflow.com/questions/355089/… Mas, neste caso, existem apenas duas chamadas ( reverse()e toString()), portanto, a diferença provavelmente nem será mensurável.
jcsahnwaldt diz GoFundMonica
17

Aqui está um exemplo usando recursão:

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
fonte
2
Já existem respostas muito melhores, especialmente as de DanielBrockman. Se um algoritmo já existe em uma biblioteca padrão, não há necessidade de fabricá-lo manualmente e reinventar a roda.
precisa
14
Um conceito de "resposta muito melhor" é subjetivo. Isso pode ser exatamente o que alguém está procurando.
C0D3LIC1OU5
2
O OP já declarou que "existe algum tipo de função já embutida no Java que faz isso", então seu objetivo era saber exatamente qual "função" é essa. Apenas postar uma resposta que tenha pouco a ver com a pergunta real não faz sentido. Se alguém pedisse uma implementação personalizada, sua resposta seria justificada, nesse caso, não é.
precisa
Voto negativo. A maioria das outras soluções é O (n) e pode lidar com cadeias de caracteres de praticamente qualquer tamanho, essa é O (n ^ 2) e tende a travar com um StackOverflowError para cadeias com mais de cerca de 5000 caracteres (no JDK 8 VM, configuração padrão) .
jcsahnwaldt diz GoFundMonica
1. As outras soluções não usam recursão e podem lidar com seqüências longas muito bem. Por que você usaria recursão em vez de iteração para uma tarefa como essa? Isso não faz sentido. (A menos que você tenha um histórico de programação funcional, o que geralmente leva a problemas quando você está escrevendo código em uma linguagem imperativa / OO.) 2. Concatenação de string (esse pequeno inocente '+') é O (n). Você deve ser novo em Java, caso contrário, você saberia disso.
jcsahnwaldt diz GoFundMonica
12

Aqui está uma solução de baixo nível:

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
fonte
12

Eu tentei, apenas por diversão, usando uma pilha. Aqui meu 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
fonte
11

Como o método abaixo (usando XOR ) para reverter uma string não está listado, estou anexando esse método para reverter uma string.

O algoritmo é baseado em:

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

}

Resultado:

keetarp

Prateek Joshi
fonte
8

Como outros já apontaram, a maneira preferida é usar:

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

Mas se você quiser implementar isso sozinho, receio que o restante das respostas tenha falhas.

O motivo é que Stringrepresenta uma lista de pontos Unicode , codificados em uma char[]matriz de acordo com a codificação de comprimento variável: UTF-16 .

Isso significa que alguns pontos de código usam um único elemento da matriz (uma unidade de código), mas outros usam dois deles; portanto, pode haver pares de caracteres que devem ser tratados como uma única unidade (substitutos "altos" e "baixos" 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
fonte
Boa solução, apenas uma parte que falta agora está lidando com a combinação de diacríticos :-D
René
6

É muito simples no código mínimo de linhas

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
fonte
Eu ia escrever isso agora .. Descobri que você já escreveu!
Jency
4

Isso fez o truque para mim

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
fonte
4

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

OU

return new StringBuilder(inputString).reverse().toString();
Avijit Karmakar
fonte
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);

Eu usei esse método para transformar nomes para trás e para minúsculas.

Stormhawks
fonte
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
fonte
Novamente, pares substitutos serão corrompidos dessa maneira.
precisa saber é o seguinte
@JamesSmith, você poderia expandir isso, por favor?
Dom Shahbazi
1
Alguns caracteres unicode consistem em dois caracteres; se esses dois forem trocados, a string estará corrompida. Além disso, um erro geralmente esquecido é o regex.
precisa saber é o seguinte
2

Uma maneira natural de reverter um Stringé usar StringTokenizerae uma pilha. Stacké uma classe que implementa uma pilha de objetos last-in-first-out (LIFO) fácil de usar.

String s = "Hello My name is Sufiyan";

Coloque-o na pilha para frente

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

Imprimir a pilha para trá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
fonte
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
fonte
Isso não responde à pergunta.
21715 Ryan
2

Toda a solução acima é muito boa, mas aqui estou fazendo uma string reversa usando programação recursiva.

Isso é útil para quem está procurando uma maneira recursiva de fazer uma string reversa.

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
fonte
2

Procedimento:

Podemos usar split () para dividir a string. Em seguida, use o loop reverso e adicione os 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
fonte
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
fonte
1

Você também pode tentar o seguinte:

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
fonte
1
existem muitos métodos para reverter uma string. este é um deles usando a classe stringbuffer de java. a resposta aceita está usando a classe diff para reverter, o que não está disponível na versão mais antiga do 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
fonte
1

recursão:

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

Apenas por diversão..:)

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

Atravesse i de 0 a len / 2 e depois

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

Complexidade temporal: O (n)

Complexidade 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
fonte
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
fonte
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
fonte
Isso apenas gera o char da string, um por um. E também não pode ser usado em nenhum lugar do programa. É muito melhor criar uma variável String, inserir o "char" um por um na string e retornar a string.
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
fonte
@ Dharman obrigado pela resposta. explicação adicional e mais uma solução.
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
fonte
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 você quiser usar um simples loop for!

Apetrei Ionut
fonte