2010-03-07 12 views
5

Ho alcune idee di base su come eseguire questa operazione, ma non sono sicuro se lo sto facendo bene. Quindi abbiamo WindyString di classe con metodo blow. Dopo averlo usato:Vento che soffia sulla stringa

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

dovremmo ottenere qualcosa di simile:

    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 

così in poche parole in ogni seconda parola prendiamo ogni vocali e spostarli una riga sopra. Nella seconda metà delle parole spostiamo le vocali di una riga in basso.

So che dovrei dividere la stringa in token con tokenizer o metodo split, ma quale sarà il prossimo? Crea 3 matrici che rappresentano ciascuna riga?

risposta

2

Il modo più semplice è utilizzare regex. Questo dovrebbe essere istruttivo:

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

ho aggiunti i | caratteri nell'output per dimostrare che questa elabora spazi bianchi eccesso correttamente - tutte e tre le linee sono garantite la stessa lunghezza, avendo cura di spazi vuoti, spazi vuoti, o addirittura TUTTI gli spazi vuoti inseriti.

Se non si ha familiarità con le espressioni regolari, questo è sicuramente un buon modo per iniziare a imparare.

Il middle è semplicemente la stringa originale con tutte le vocali sostituite con spazi.

Quindi, side[0] e side[1] sono rispettivamente le prime e ultime linee. Usiamo il Scanner per estrarre ogni parola (preservando gli spazi iniziali e finali). Il modo in cui elaboriamo ogni parola è che in un lato tutto è sostituito da spazi vuoti; nell'altro, solo le non-vocali sono sostituite da spazi vuoti. Giriamo i lati di ogni parola che elaboriamo.

+0

puoi condurmi attraverso questa espressione regolare? – owca

+0

I regex possono essere molto complicati, ma sto usando solo elementi di base qui. Leggi le esercitazioni, in particolare per quanto riguarda: classe di caratteri '[' ... ']' e le scorciatoie '\ s' e' \ S', la negazione '^', il punto metacarattere '.' e la ripetizione' * '. Non scoraggiarti: regex è uno strumento molto potente. – polygenelubricants

5

Sì, questo è probabilmente un modo facile (non molto performante) per risolvere il problema.

Creare 3 array; uno è riempito con i dati effettivi e 2 matrici sono riempite (Arrays.fill) con ' '.

Quindi eseguire l'iterazione sull'array contenente i dati effettivi e mantenere un numero intero di quale parola si sta correntemente correntemente e un valore booleano se sono già stati abbinati spazi.

Durante l'iterazione, si controlla se il carattere è una vocale o no. Se si tratta di una vocale, controllare il conteggio delle parole (stranezza/uniformità) e posizionarlo nel primo o nel terzo array. Quando raggiungi uno spazio bianco, imposta il valore booleano e aumenta il conteggio delle parole. Se raggiungi un altro spazio, controlla se lo spazio è già impostato: se sì, continua. Se si abbina uno spazio non bianco, reimpostare lo spazio bianco booleano.

Quindi unire tutti gli array e aggiungere un carattere di nuova riga tra ciascun array unito e restituire la stringa.

Problemi correlati