5

我对如何完成这项任务有一些基本的想法,但我不确定我是否做得对。所以我们有带有方法的 WindyString 类。使用后:

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 个数组,每个数组代表每一行?

4

2 回答 2

5

是的,这可能是解决问题的一种简单(不是非常高效)的方法。

创建3个数组;一个用实际数据填充,2 个数组用 填充(Arrays.fill' '

然后遍历包含实际数据的数组,并保留您当前所在单词的整数,如果您已经匹配了空格,则保留一个布尔值。

迭代时,检查字符是否为元音。如果是元音,请检查字数(奇数/偶数)并将其放在第一个或第三个数组中。当您到达空格时,设置布尔值并增加字数。如果您到达另一个空格,请检查该空格是否已设置:如果是,请继续。如果匹配非空白,则重置空白布尔值。

然后将所有数组连接在一起,并在每个连接数组之间附加一个换行符并返回字符串。

于 2010-03-07T20:05:44.100 回答
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来提取每个单词(保留前导和尾随空格)。我们处理每个单词的方式是,在一侧,所有内容都被空格替换;另一方面,只有非元音被空格代替。我们处理的每一个字都会反其道而行之。

于 2010-03-07T21:00:11.650 回答