2010-04-26 12 views
12

¿Alguien puede decirme cómo escribir un programa Java para invertir una oración dada?Invertir una oración dada en Java

Por ejemplo, si la entrada es:

"Esta es una pregunta de la entrevista"

La salida debe ser:

"pregunta de la entrevista una es este"

+0

Probablemente debería considerar tomar clases de certificación de Java, ya que le enseñará USADOS librerías de clases de Java. A continuación, tendrá las herramientas necesarias para llevar a cabo tales tareas. –

+1

Invierta la cadena primero. Invierta las palabras entonces. Toma dos pasa pero muy limpio. Se puede hacer en 1 pase también. – Jack

+1

@jack, creo que su primera palabra fue para ser "dividida", ¿sí? – CPerkins

Respuesta

23

Divides la cadena por el espacio y luego iteras sobre ella hacia atrás para ensamblar la oración invertida.

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 " 
+7

¿No agregará esto un espacio al final? – Skilldrick

+2

¿Hay alguna razón por la que esté concatenando con una 'cadena' (que crea un nuevo objeto' cadena' cada vez) en lugar de usar 'StringBuilder'? –

+0

@Christopher Parker - Simplemente mostrando el principio. Esto, por supuesto, puede adaptarse para ser más eficiente (si es necesario). – Oded

6

Simplemente divídalo en un carácter de espacio en una matriz de cadenas, luego recorra la matriz en orden inverso y construya la cadena de salida.

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 += " "; } 
} 
+0

puede por favor dar el código sin usar split() – Max

22
String[] words = sentence.split(" "); 
String[] reversedWords = ArrayUtils.reverse(words); 
String reversedSentence = StringUtils.join(reversedWords, " "); 

(usando ArrayUtils y StringUtils de commons-lang, pero estos son métodos fáciles para escribir - a sólo unos bucles)

+7

Usando una biblioteca externa para una pregunta de entrevista, esto simple no va a ir tan bien. –

+5

bien. que ir más allá de ir no es simple esta entrevista de preguntas y una biblioteca fuera de – Powerlord

+5

@ D'Nabre - si conoces commons-lang lo suficientemente bien como para escribir ese código, creo que iría MUY bien sobre eso bien. –

6

Bozho ya se dio una gran respuesta en Java específico, pero en el caso de que alguna vez necesite resolver este problema sin los métodos de la API de Java:

Para invertir, puede simplemente mostrar palabras individuales en un stack y hacer que vuelvan a apagarse cuando no queden palabras.

(Para ser más claros, Java proporciona un Stack class, por lo que es posible utilizar este método en Java también).

3

un poco aburrido de todos los 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 maravilloso que es un poco más legible:

"this is an interview question" 
    .split("\\s") 
    .reverse() 
    .join(' ') 
+0

@ Oded's es mucho más agradable ... está acostumbrado a simplemente usar colecciones. –

19

Sólo por ser diferente: una solución recursiva. No agrega espacios adicionales.

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]" 

También voy a mejorar en la solución mediante el uso de split\b lugar (es tan obvio!).

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]" 
+0

Bien, realmente me gustó el diseño de la solución recursiva, pero el iterador + generador de cadenas tiene que ser más rápido, ¿correcto? – user797963

3

también darle una oportunidad: Aquí hay una versión que utiliza una pila y un escáner:

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

    } 

} 
1

mejor enfoque probablemente .. había visto la somewhere..here lógica es mi código que podría hacer el trabajo.

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

no creo que puedes usar cualquier biblioteca .. 1) Invertir cadena entera 2) Invertir cada palabra.

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

Esto funcionará con ascii charset only ... no es la solución ideal. –

0

nadie ha mencionado una solución basada en Java de vainilla 8 sin embargo, lo que es lo mismo que Bozho's, pero sin ningún tipo de bibliotecas de terceros. Así que aquí está:

String input = "This is interview question"; 

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

Antes StringTokenizer fue declarada herencia, muchos utilizado StringTokenizer para esto. Pensé que lo dejaría aquí.

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

Por favor, intente la siguiente solución, esto está funcionando para mí.

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

} 
0

más corta respuesta

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

}

O

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