有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

爪哇风吹在弦上

我对如何完成这项任务有一些基本的想法,但我不确定我是否做对了。所以我们和我一起上了课。使用后:

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

简而言之,在每一个单词中,我们选取每个元音,并将它们移到上面一行。在单词的后半部分,我们将元音移到下面一行

我知道我应该使用标记器或split方法将字符串拆分为标记,但接下来呢?创建3个数组,每个数组代表每一行


共 (2) 个答案

  1. # 1 楼答案

    是的,这可能是解决问题的一种简单(不是很有效)的方法

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

    然后迭代包含实际数据的数组,并保留当前所在单词的整数,如果已匹配空格,则保留布尔值

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

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

  2. # 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来提取每个单词(保留前导和尾随空格)。我们处理每一个单词的方式是,在一个方面,所有的东西都被空白所取代;在另一种情况下,只有非元音被空格代替。我们处理的每一个词都是反方向的