Inverser une chaîne en Java

467

J'ai "Hello World"conservé une variable String nommée hi.

J'ai besoin de l'imprimer, mais inversé.

Comment puis-je faire ceci? Je comprends qu'il existe une sorte de fonction déjà intégrée à Java qui fait cela.

Connexes: inverser chaque mot individuel de la chaîne «Hello World» avec Java

Ron
la source
7
@JRL devrait vraiment être String ih = "dlroW olleH"; System.out.println (ih);
Matthew Farwell
4
J'aimerais pouvoir retirer mon vote serré (en double). J'ai relu l'autre question et j'ai réalisé qu'elle était subtilement différente de celle-ci. Cependant, cette question est toujours dupliquée plusieurs fois sur le site. Devrait probablement trouver une autre question pour marquer ce dupe de.
Rob Hruska
vous pouvez utiliser la fonction reverse () de la classe StringBuilder, la méthode toCharArray (), l'échange de caractères et bien d'autres. consultez cette ressource pour plus d'exemples, flowerbrackets.com/2-best-ways-to-reverse-a-string-in-java
Shiva
StringBuilder.reverse () est une solution plus lisible et élégante.
lokesh

Réponses:

980

Vous pouvez utiliser ceci:

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

Ou, pour les versions antérieures à JDK 1.5, utilisez java.util.StringBufferau lieu de StringBuilder- ils ont la même API. Merci aux commentateurs d'avoir souligné que StringBuilderc'est préférable de nos jours lorsqu'il n'y a pas de problème de concurrence.

Daniel Brockman
la source
13
"Merci aux commentateurs d'avoir souligné que StringBuilder est préféré de nos jours"? Il y a une déclaration claire que StringBuffer si la sécurité des threads est un problème. sinon, StringBuilder peut être utilisé. StringBuilder ne remplace pas StringBuffer.
ha9u63ar
15
@ ha9u63ar Pour ce scénario avec une StringBuilderconcurrence locale jetable n'est pas un problème (et je pense que c'est ce qu'il voulait dire).
xehpuk
2
Voici le lien pour connaître la différence exacte entre les deux: javatpoint.com/… en bref: StringBuilder est plus efficace que StringBuffer. Ce n'est pas sûr pour les threads, c'est-à-dire que plusieurs threads peuvent appeler simultanément des méthodes de StringBuilder.
Vishnu Narang
Cela ne fonctionnera pas pour les caractères Unicode en dehors de BMP, tant que pour combiner des caractères.
nau
2
@Daniel Brockman, Merci pour votre réponse agréable et concise. Ici OP a dit, j'ai "Hello World" conservé dans une variable de chaîne nommée hi . Ça veut dire String hi = "Hello World";. Je pense donc que dans votre réponse, il ne devrait pas y avoir de guillemets hi. Je veux dire que cela devrait être comme çanew StringBuilder(hi).reverse().toString()
Md. Abu Nafee Ibna Zahid
109

Pour les problèmes de juges en ligne qui ne permettent pas StringBuilderou StringBuffer, vous pouvez le faire en place en utilisant char[]comme suit:

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
la source
Mais juste une note. Cela échouera horriblement pour les "caractères" qui occupent deux octets.
Minas Mina
En fait, cela fonctionne généralement bien pour la plupart des caractères qui occupent 2 octets. Ce qu'il échoue en réalité, ce sont les points de code Unicode qui occupent 2 unités de codage 16 bits (en UTF-16).
Stephen C
C'est une bonne solution, mais pouvons-nous faire de même si nous avons 10 000 caractères en chaîne avec un minimum de complexité.
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
la source
4
Bonne solution (1+). Une amélioration - StringBuilder (depuis java5) sera plus rapide que StringBuffer. Cordialement.
Michał Šrajer
31
Cela ne fonctionnera pas dans le cas général car il ne tient pas compte du fait que certains "caractères" en unicode sont représentés par une paire de substitution, c'est-à-dire deux caractères Java, et cette solution a pour conséquence que la paire est dans le mauvais ordre. La méthode inverse de StringBuilder devrait être correcte
Ian Fairman
59
String string="whatever";
String reverse = new StringBuffer(string).reverse().toString();
System.out.println(reverse);
Luchian Grigore
la source
7
Quelle en est la complexité? O (N) ou plus? N est égal à la longueur de la chaîne.
Mukit09
O (n) car il doit parcourir les caractères de la chaîne au moins une fois.
PlsWork
26

Je fais cela en utilisant les deux manières suivantes:

Chaîne inversée par PERSONNAGES:

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

Chaîne inversée par MOTS:

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
la source
19

Jetez un œil à l'API Java 6 sous StringBuffer

String s = "sample";
String result = new StringBuffer(s).reverse().toString();
Andrew Briggs
la source
est-ce mieux que StringBuilder?
CamHart
@CamHart Non, c'est plus lent, mais probablement un tout petit peu.
jcsahnwaldt dit GoFundMonica
1
Une petite référence avec près de 100 millions d'appels de méthode a montré une différence significative entre StringBuffer et StringBuilder: stackoverflow.com/questions/355089/… Mais dans ce cas, il n'y a que deux appels ( reverse()et toString()), donc la différence ne sera probablement même pas mesurable.
jcsahnwaldt dit GoFundMonica
17

Voici un exemple utilisant la récursivité:

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
la source
2
Il existe déjà de bien meilleures réponses, en particulier celles de @ DanielBrockman. Si un algorithme existe déjà dans une bibliothèque standard, il n'est pas nécessaire de le fabriquer à la main et de réinventer la roue.
Willi Mentzel
14
Un concept de "bien meilleure réponse" est subjectif. C'est peut-être exactement ce que quelqu'un recherche.
C0D3LIC1OU5
2
L'OP a déjà déclaré qu '"il existe une sorte de fonction déjà intégrée à Java qui fait cela", son objectif était donc de savoir exactement de quelle "fonction" il s'agit. Le simple fait de poster une réponse qui n'a pas grand-chose à voir avec la question posée est insensé. Si quelqu'un demandait une implémentation personnalisée, votre réponse serait justifiée, dans ce cas, elle ne l'est pas.
Willi Mentzel
Downvote. La plupart des autres solutions sont O (n) et peuvent gérer des chaînes de presque n'importe quelle longueur, celle-ci est O (n ^ 2) et a tendance à planter avec un StackOverflowError pour les chaînes de plus de 5000 caractères environ (sur JDK 8 VM, configuration par défaut) .
jcsahnwaldt dit GoFundMonica
1. Les autres solutions n'utilisent pas la récursivité et peuvent très bien gérer les longues chaînes. Pourquoi utiliseriez-vous la récursivité au lieu de l'itération pour une tâche comme celle-ci? Cela n'a aucun sens. (Sauf si vous venez d'un arrière-plan de programmation fonctionnelle, ce qui entraîne souvent des problèmes lorsque vous écrivez du code dans un langage impératif / OO.) 2. La concaténation de chaînes (ce petit + +) innocent est O (n). Vous devez être nouveau sur Java, sinon vous le sauriez.
jcsahnwaldt dit GoFundMonica le
12

Voici une solution de bas niveau:

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
la source
12

J'ai essayé, juste pour le plaisir, en utilisant une pile. Voici mon 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
la source
11

Étant donné que la méthode ci-dessous (en utilisant XOR ) pour inverser une chaîne n'est pas répertoriée, j'attache cette méthode pour inverser une chaîne.

L' algorithme est basé sur:

1. (A XOR B) XOR B = A

2. (A XOR B) XOR A = B

Extrait de code:

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

}

Production:

Keetarp

Prateek Joshi
la source
8

Comme d'autres l'ont souligné, la méthode préférée consiste à utiliser:

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

Mais si vous voulez l'implémenter par vous-même, je crains que le reste des réponses aient des défauts.

La raison en est que Stringreprésente une liste de points Unicode , codés dans un char[]tableau selon le codage de longueur variable: UTF-16 .

Cela signifie que certains points de code utilisent un seul élément du tableau (une unité de code) mais d'autres en utilisent deux, il peut donc y avoir des paires de caractères qui doivent être traitées comme une seule unité (substituts consécutifs "haut" et "bas") .

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
la source
Bonne solution, il ne manque plus qu'une partie de la gestion des combinaisons de signes diacritiques :-D
René
6

C'est très simple en code minimum de lignes

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
la source
J'allais écrire ceci maintenant .. Vous l'avez déjà écrit!
Jency
4

Cela a fait l'affaire pour moi

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
la source
4

1. Utilisation du tableau de caractères:

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. Utilisation de 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
la source
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);

J'ai utilisé cette méthode pour transformer les noms en arrière et en minuscules.

Stormhawks
la source
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
la source
Encore une fois, les paires de substitution seront corrompues de cette façon.
HyperNeutrino
@JamesSmith pourriez-vous développer cela s'il vous plaît?
Dom Shahbazi
1
Certains caractères Unicode se composent de deux caractères; si ces deux sont inversés, la chaîne est corrompue. En outre, une erreur souvent négligée est l'expression régulière.
HyperNeutrino
2

Une façon naturelle d'inverser a Stringconsiste à utiliser a StringTokenizeret une pile. Stackest une classe qui implémente une pile d'objets LIFO (dernier entré, premier sorti) facile à utiliser.

String s = "Hello My name is Sufiyan";

Mettez-le dans la pile devant

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

Imprimer la pile à l'envers

System.out.print('"' + s + '"' + " backwards by word is:\n\t\"");
while (!myStack.empty()) {
  System.out.print(myStack.pop());
  System.out.print(' ');
}

System.out.println('"');
Soufiyan Ghori
la source
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
la source
Cela ne répond pas à la question.
Ryan
2

Toute la solution ci-dessus est trop bonne mais ici je fais de la chaîne inverse en utilisant une programmation récursive.

Cela est utile pour ceux qui recherchent une manière récursive de faire une chaîne inversée.

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
la source
2

Procédure:

Nous pouvons utiliser split () pour diviser la chaîne. Ensuite, utilisez la boucle inverse et ajoutez les caractères.


Extrait de code:

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
la source
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
la source
1

Vous pouvez également essayer ceci:

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
la source
1
il existe de nombreuses méthodes pour inverser une chaîne. C'est l'une d'entre elles qui utilise la classe stringbuffer de java.accepted answer utilise la classe diff pour inverser ce qui n'était pas disponible dans l'ancienne version 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
la source
1

récursivité:

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

Juste pour le fun..:)

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

Traverser i de 0 à len / 2 puis

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

Complexité temporelle: O (n)

Complexité spatiale: 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
la source
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
la source
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
la source
Cela ne fait que sortir les caractères de la chaîne un par un. Et il ne peut pas non plus être utilisé n'importe où dans le programme. Il est préférable de créer une variable String, d'insérer le "char" un par un dans la chaîne, puis de renvoyer la chaîne.
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
la source
@Dharman merci pour la réponse. explication ajoutée et une solution de plus.
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
la source
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 vous voulez utiliser une boucle for simple!

Apetrei Ionut
la source