web-dev-qa-db-fra.com

Inverser une phrase donnée en Java

Quelqu'un peut-il me dire comment écrire un programme Java pour inverser une phrase donnée?

Par exemple, si l'entrée est:

"Ceci est une question d'entrevue"

La sortie doit être:

"question interview an is this"

12
giri

Vous divisez la chaîne par l’espace puis parcourez-la en arrière pour assembler la phrase inversée.

String[] words =  "This is interview question".split(" ");

String rev = "";
for(int i = words.length - 1; i >= 0 ; i--)
{
   rev += words[i] + " ";
}

// rev = "question interview is This "

// can also use StringBuilder:
StringBuilder revb = new StringBuilder();
for(int i = words.length - 1; i >= 0 ; i--)
{
   revb.append(words[i]);
   revb.append(" ");
}
// revb.toString() = "question interview is This "
24
Oded
String[] words = sentence.split(" ");
String[] reversedWords = ArrayUtils.reverse(words);
String reversedSentence = StringUtils.join(reversedWords, " ");

(utiliser ArrayUtils et StringUtils de commons-lang, mais ce sont des méthodes faciles à écrire - juste quelques boucles)

23
Bozho

Juste être différent: une solution récursive. N'ajoute pas d'espaces supplémentaires.

public static String reverse(String s) {
   int k = s.indexOf(" ");
   return k == -1 ? s : reverse(s.substring(k + 1)) + " " + s.substring(0, k);
}


System.out.println("[" + reverse("This is interview question") + "]");
// prints "[question interview is This]"

Je vais aussi améliorer la solution split en utilisant plutôt \b (c'est tellement évident!).

    String[] parts = "Word boundary is better than space".split("\\b");
    StringBuilder sb = new StringBuilder();
    for (int i = parts.length; i --> 0 ;) {
        sb.append(parts[i]);
    }
    System.out.println("[" + sb.toString() + "]");
    // prints "[space than better is boundary Word]"
19
polygenelubricants

Divisez-le simplement sur un caractère d'espacement en un tableau de chaînes, puis passez en boucle sur le tableau dans l'ordre inverse et construisez la chaîne de sortie.

String input = "This is interview question";
String output = "";
String[] array = input.split(" ");
for(int i = array.length-1; i >= 0; i--)
{
    output += array[i];
    if (i != 0) { output += " "; }
}
6
Rich Adams

Bozho a déjà donné une excellente réponse spécifique à Java, mais si jamais vous avez besoin de résoudre ce problème sans les méthodes de l'API Java:

Pour inverser, vous pouvez simplement ajouter des mots individuels dans un stack et les supprimer tous lorsqu'il ne reste plus de mots.

(Juste pour être très clair, Java fournit une Stack classe , il est donc possible d'utiliser cette méthode également en Java).

6
Pops

J'essaye aussi: Voici une version utilisant une pile et un scanner:

String input = "this is interview question";
Scanner sc = new Scanner(input);
Stack<String> stack = new Stack<String>();

while(sc.hasNext()) {
    stack.Push(sc.next());
}

StringBuilder output = new StringBuilder();

for(;;) { // forever
    output.append(stack.pop());

    if(stack.isEmpty()) {
        break; // end loop
    } else {
        output.append(" ");
    }
}
3
Searles

un peu ennuyeux de Java:

List<String> l = new ArrayList<String>(Arrays.asList("this is an interview question".split("\\s")));
Collections.reverse(l);
StringBuffer b = new StringBuffer();
for( String s : l ){
    b.append(s).append(' ');
}
b.toString().trim();

en groovy c'est un peu plus lisible:

"this is an interview question"
    .split("\\s")
    .reverse()
    .join(' ')
3
Gareth Davis
public class ReverseString {

    public void reverse(String[] source) {

        String dest = "";
        for (int n = source.length - 1; n >= 0; n--) {
            dest += source[n] + " ";
        }
        System.out.println(dest);

    }

    public static void main(String args[]) {
        ReverseString rs = new ReverseString();
        String[] str = "What is going on".split(" ");
        rs.reverse(str);

    }

}
2
gmhk

Personne n'a encore mentionné de solution Java 8 basée sur Vanilla, identique à Bozho's , mais sans aucune bibliothèque tierce. Alors la voici:

String input = "This is interview question";

List<String> list = Arrays.asList(input.split(" "));
Collections.reverse(list);
System.out.println(list.stream().collect(Collectors.joining(" ")));
1
Lukas Eder

une approche plus agréable probablement .. avait vu la logique quelque part..il y a mon code qui pourrait faire le travail.

    public class revWords {

    public static void main(String[] args) {

        revWords obj = new revWords();
        String print = obj.reverseWords("I am God");
        System.out.println(print);

    }

    public String reverseWords(String words)
    {
      if(words == null || words.isEmpty() || !words.contains(" "))
        return words;

      String reversed = "";
      for( String Word : words.split(" "))
        reversed = Word + " " + reversed;

      return reversed;
    }

}
1
Shashi

s'il vous plaît essayer ci-dessous solution, cela fonctionne pour moi. 

public class reverseline {

public static void main(String[] args) {
    // TODO Auto-generated method stub

        String str="This is interview question";
    String words[]=str.split(" ");
    for(int i=words.length-1;i>=0;i--){
        System.out.print(words[i]+" ");
    }
}

}
1
Babasaheb Matsagar

Je ne pense pas que vous devriez utiliser une bibliothèque .. 1) Inverser la chaîne entière 2) Inverser chaque mot.

public static void revWord(char[] a) {

    // reverse whole
    revWord(a, 0, a.length);

    int st = -1;
    int end = -1;

    for (int i = 0; i < a.length; i++) {

        if (st == -1 && a[i] != ' ') {
            st = i;
        }
        if (end == -1 && a[i] == ' ' ) {
            end = i;
        }
        if(i == a.length-1){
            end=i+1;
        }

        if (st != -1 && end != -1) {
            revWord(a, st, end );

            st = -1;
            end = -1;
        }

    }

}

public static void revWord(char[] a, int s, int l) {
    int mid = (l - s) / 2;
    l--;

    for (int i = 0; i < mid; i++, l--) {
        char t = a[s+i];
        a[s+i] = a[l];
        a[l] = t;
    }
}

`

1
Rajender Saini

Réponse la plus courte

public class ReverseSentance {

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter a sentance");
    String inputString = sc.nextLine();

    String[] words = inputString.split(" ");

    List<String> reverseWord = Arrays.asList(words);
    Collections.reverse(reverseWord);

    Iterator itr = reverseWord.iterator();

    while (itr.hasNext()) {
        System.out.print(itr.next() + " ");
    }
}

}

OU

public class ReverseSentance {

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter a sentance");
    String inputString = sc.nextLine();

    String[] words = inputString.split(" ");

    for (int i = words.length-1 ; i >= 0; i--) {
        System.out.print(words[i] +" ");
    }
}
0
Rishabh Agarwal

Avant StringTokenizer était déclaré héritage, beaucoup utilisaient StringTokenizer pour cela. Je pensais simplement le laisser ici.

String sentence = "This is interview question";
String reversed = "";
StringTokenizer tokens = new StringTokenizer(sentence); 

while (tokens.hasMoreTokens()) { // Loop through each token
    reversed =  tokens.nextToken() + ' ' + reversed; //add to start
}

System.out.println(reversed.trim());
0
Sajal Dutta