2010-03-07 5 views
5

Ich habe eine grundlegende Idee, wie Sie diese Aufgabe erledigen, aber ich bin mir nicht sicher, ob ich es richtig mache. Also haben wir Klasse WindyString mit metod blasen. Nachdem er es:Wind weht auf String

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

sollten wir so etwas wie dieses erhalten:

    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 

so auf den Punkt in jedem zweiten Wort holen wir alle Vokale und ihnen eine Zeile oben bewegen. In der zweiten Worthälfte bewegen wir die Vokale eine Zeile darunter.

Ich weiß, ich sollte String auf Token mit Tokenizer oder Split-Methode teilen, aber was nun? Erstellen Sie 3 Arrays, die jede Zeile repräsentieren?

Antwort

2

Der einfachste Weg ist die Verwendung von Regex. Dies sollte aufschlussreich sein:

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

ich die | Zeichen in der Ausgabe hinzugefügt zu zeigen, dass dies richtig überschüssige Leerzeichen verarbeitet - alle drei Linien die gleiche Länge garantiert, die führenden Leerzeichen, nachgestellten Leerzeichen die Pflege oder sogar ALLE Leerzeichen eingegeben.

Wenn Sie mit regulären Ausdrücken nicht vertraut sind, ist dies definitiv ein guter Einstieg in das Lernen.

Die middle ist einfach die ursprüngliche Zeichenfolge mit allen Vokalen durch Leerzeichen ersetzt.

Dann sind side[0] und side[1] die oberen bzw. unteren Zeilen. Wir verwenden die Scanner, um jedes Wort zu extrahieren (führende und nachfolgende Leerzeichen werden beibehalten). Die Art, wie wir jedes Wort verarbeiten, ist, dass auf der einen Seite alles durch Leerzeichen ersetzt wird; in der anderen werden nur Nicht-Vokale durch Leerzeichen ersetzt. Wir wenden uns mit jedem Wort, das wir verarbeiten, auf die Seite.

+0

können Sie mich durch diese Regex führen? – owca

+0

Regexes können sehr schwierig sein, aber ich benutze nur grundlegende Elemente hier. Lies Tutorials, speziell in Bezug auf: die Zeichenklasse '[' ... ']' und die Kurzzeichen '\ s' und' \ S', die Negation '^', das Punkt-Metazeichen '.' und die Wiederholung' * '. Nicht entmutigen: Regex ist ein sehr mächtiges Werkzeug. – polygenelubricants

5

Ja, das ist wahrscheinlich ein einfacher (nicht sehr performanter) Weg, um das Problem zu lösen.

Erstellen Sie 3 Arrays; eine ist mit den tatsächlichen Daten gefüllt und 2 Felder sind gefüllt (Arrays.fill) mit ' '.

Dann iterieren Sie über das Array mit den tatsächlichen Daten, und behalten Sie eine ganze Zahl von dem Wort, das Sie gerade sind und eine boolesche, wenn Sie bereits whitespace übereinstimmen.

Während der Iteration prüfen Sie, ob das Zeichen ein Vokal ist oder nicht. Wenn es ein Vokal ist, überprüfe die Wortzählung (Ungerade/Gleichmäßigkeit) und lege sie in das erste oder dritte Feld. Wenn Sie einen Leerraum erreichen, setzen Sie den Booleschen Wert und erhöhen Sie die Wortzahl. Wenn Sie einen anderen Leerraum erreichen, überprüfen Sie, ob der Leerraum bereits gesetzt ist: Wenn ja, fahren Sie fort. Wenn Sie mit einem Nicht-Whitespace übereinstimmen, setzen Sie den Whitespace-Booleschen Wert zurück.

Fügen Sie dann alle Arrays zusammen und fügen Sie ein neues Zeichen zwischen jedem verbundenen Array ein und geben Sie die Zeichenfolge zurück.