2010-03-07 26 views
5

我對如何完成這項任務有一些基本的想法,但我不知道我是否做得對。所以我們有類風吹與metod吹。使用後:風吹在字符串上

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

我們應該得到這樣的事情:

    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 

所以在每第二個字概括地說,我們選擇的每一個元音及以上動他們一行。在下半部分中,我們將元音移動到下面一行。

我知道我應該用字符串或拆分方法將字符串拆分爲標記,但接下來呢?創建3個數組,每個代表每一行?

回答

2

最簡單的方法是使用正則表達式。這應該是有啓發:

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

我加入了|字符輸出,以表明該正確處理多餘的空格 - 所有三條線都保證相同的長度,以領先的空白照顧,尾隨空白,甚至所有空白輸入。

如果你不熟悉正則表達式,這絕對是一個很好的開始學習。

middle只是原始字符串,所有元音都用空格替換。

然後,side[0]side[1]分別是頂部和底部線。我們使用Scanner來提取每個單詞(保留前導和尾隨空格)。我們處理每個單詞的方式是,一方面,一切都被空白取代;另一方面,只有非元音被空白代替。我們用我們處理的每一個單詞翻轉兩側。

+0

你能帶領我通過這個正則表達式嗎? – owca 2010-03-08 00:24:10

+0

正則表達式可能非常棘手,但我只在這裏使用基本元素。閱讀教程,特別是關於:字符類''''''''和'\ s'和'\ S'簡寫,否定'^',點元字符'.'和重複'*'。不要氣餒:正則表達式是一個非常強大的工具。 – polygenelubricants 2010-03-08 00:40:17

5

是的,這可能是一種簡單(不是很高效)的方法來解決問題。

創建3個數組;一個填充實際數據並且填充2個陣列(Arrays.fill)與' '

然後遍歷包含實際數據的數組,並保留當前所在單詞的整數以及布爾值(如果您已經匹配了空格)。

迭代時,檢查字符是不是元音。如果是元音,請檢查單詞數(奇數/均勻度)並將其放在第一個或第三個數組中。 當你達到一個空格時,設置布爾值並增加字數。如果你到達另一個空格,檢查是否已經設置了空格:如果是,繼續。如果您匹配非空白字符,請重置空白布爾值。

然後將所有數組連接在一起,並在每個連接數組之間附加一個換行符並返回字符串。