2010-03-07 18 views
5

Tengo una idea básica de cómo hacer esta tarea, pero no estoy seguro si lo estoy haciendo bien. Entonces tenemos la clase WindyString con metod blow. Después de usarlo:Viento soplando en String

System.out.println(WindyString.blow(
    "Abrakadabra!   The second chance to pass has already BEGUN! ")); 

deberíamos obtener algo como esto:

    e    a e   a   a ea y 
    br k d br ! Th s c nd ch nc t p ss h s lr d B G N! 
    A a a a a   e o    o   a    E U 

por lo que en pocas palabras en cada segunda palabra que recoger todos los vocales y los mover una línea arriba. En la segunda mitad de las palabras movemos las vocales una línea abajo.

Sé que debo dividir la cadena en tokens con tokenizer o método de división, pero ¿qué sigue? Crear 3 matrices, cada una representando cada fila?

Respuesta

2

La manera más simple es utilizar expresiones regulares. Esto debería ser instructivo:

static String blow(String s) { 
    String vowels = "aeiouAEIOU"; 
    String middle = s.replaceAll("[" + vowels + "]", " "); 
    int flip = 0; 
    String[] side = { "", "" }; 
    Scanner sc = new Scanner(s); 
    for (String word; (word = sc.findInLine("\\s*\\S*")) != null;) { 
     side[flip] += word.replaceAll(".", " "); 
     side[1-flip] += word.replaceAll("[^" + vowels + "]", " "); 
     flip = 1-flip; 
    } 
    return String.format("|%s|%n|%s|%n|%s|", side[0], middle, side[1]); 
} 

he añadido el | caracteres en la salida para mostrar que este exceso procesa correctamente los espacios en blanco - las tres líneas se garantiza la misma longitud, el cuidado de los blancos iniciales, los blancos de cola, o incluso TODAS las entradas en blanco.

Si no está familiarizado con las expresiones regulares, esta es definitivamente una buena forma de comenzar a aprender.

El middle es simplemente la cadena original con todas las vocales reemplazados por espacios.

Luego, side[0] y side[1] son las líneas superior e inferior, respectivamente. Usamos el Scanner para extraer cada palabra (preservando los espacios iniciales y finales). La forma en que procesamos cada palabra es que en un lado, todo se reemplaza por espacios en blanco; en el otro, solo las no vocales son reemplazadas por espacios en blanco. Nos volcamos con cada palabra que procesamos.

+0

¿me puede guiar a través de esta expresión regular? – owca

+0

Regex puede ser muy complicado, pero solo estoy usando elementos básicos aquí. Lea los tutoriales, específicamente con respecto a: la clase de caracteres '[' ... ']' y las combinaciones cortas '\ s' y' \ S', la negación '^', el metacarácter de punto '.', y la repetición' * '. No se desanime: la expresión regular es una herramienta muy poderosa. – polygenelubricants

5

Sí, esa es probablemente una forma fácil (no muy eficiente) de resolver el problema.

Crear 3 matrices; uno se llena con los datos reales y se llenan 2 matrices (Arrays.fill) con ' '.

A continuación, iterar sobre la matriz que contiene los datos reales, y mantener un número entero de la palabra que está actualmente en y un booleano si ya emparejado espacios en blanco.

Al iterar, puede verificar si el caracter es una vocal o no. Si es una vocal, verifique el recuento de palabras (imparidad/equidad) y colóquelo en la primera o tercera matriz. Cuando llegue a un espacio en blanco, configure el booleano y aumente el conteo de palabras. Si llega a otro espacio en blanco, verifique si el espacio en blanco ya está configurado: de ser así, continúe. Si coincide con un espacio no en blanco, restablezca el espacio en blanco booleano.

Luego, une todas las matrices juntas y añade un carácter de nueva línea entre cada matriz unida y devuelve la cadena.

Cuestiones relacionadas