抛光我的猪拉丁翻译(代码)(Java)

抛光我的猪拉丁翻译(代码)(Java),java,Java,我在这里的任务是使用递归创建一个可以翻译句子的pig拉丁翻译程序。规则如下: 若英语单词中并没有元音,那个么piglatin单词就是英语单词+ay。(共有十个元音:“a”、“e”、“i”、“o”和“u”,以及它们的大写对应词。“y”在本作业中不被视为元音,即my变为myay、why变为whyay等。) 否则,如果英语单词以元音开头,那么piglatin单词就是英语单词+yay 否则(如果英语单词中有元音,但不以元音开头),则Piglatin单词为end+start+“ay”,其中end和star

我在这里的任务是使用递归创建一个可以翻译句子的pig拉丁翻译程序。规则如下:

  • 若英语单词中并没有元音,那个么piglatin单词就是英语单词+ay。(共有十个元音:“a”、“e”、“i”、“o”和“u”,以及它们的大写对应词。“y”在本作业中不被视为元音,即my变为myay、why变为whyay等。)
  • 否则,如果英语单词以元音开头,那么piglatin单词就是英语单词+yay
  • 否则(如果英语单词中有元音,但不以元音开头),则Piglatin单词为end+start+“ay”,其中end和start的定义如下: -
  • 让我们从所有英语单词开始,直到(但不包括)它的第一个元音。 从第一个元音开始,英语单词的结尾都是。 但是,如果英语单词是大写的,那么大写结束和“非大写”开始

    以下是我迄今为止的代码(很抱歉,格式有点奇怪,我的评论搞乱了):

    这给了我所需的输出(“Why hello there”变成“Why ellohay erethay”)
    但现在它无法处理标点符号。基本上,我要寻找的是让我的代码处理标点符号的任何技巧或帮助,或者任何改进我的代码(仍然使用递归)的方法。

    尝试使用正则表达式匹配您的单词。正则表达式[a-zA-Z]+将匹配任何同时出现的字母序列。关于如何在java中使用正则表达式,我将把它作为一个练习留给您,但这并不难

    基本上拿着你的绳子,找到下一个匹配的。存储单词最后一个字符在原始字符串中的位置。处理该单词,然后找到下一个匹配项。现在,将上一个匹配的最后一个字符和当前匹配的第一个字符之间的子字符串原样输出,而无需任何处理

    示例:假设我有字符串“Hello,world!”

    • 第一个匹配将是“你好”,从位置0开始,在位置4结束(包括)
    • 处理并输出“Ellohay”
    • 找到下一场比赛,即从第7位开始到第11位结束的“世界”
    • 输出上一个匹配的最后一个字符和当前匹配的第一个字符之间的子字符串。这意味着从位置5到位置6,这将给出字符串“,”
    • 处理当前匹配并输出它。这将输出“orldway”
    • 试着找到下一个匹配项。现在找不到匹配项
    • 输出字符串的其余部分,无需任何处理。这意味着从位置12到字符串的末尾。这将给出子字符串“!”
    通过这种方式,该过程将“你好,世界!”转换为“你好,世界!”


    希望这有助于Cedric提供一个很好的建议,在执行处理时使用Regex

    这里我给你一些其他的指示

    首先,我相信您可以更好地重用
    firstVowel
    方法

    您的
    translateWord
    可以大大简化为(为了便于理解,我跳过了大写字母处理):

    然后,元音检查可以从长if语句更改为类似以下内容:

    if (vowels.contains(c)) {...}
    
    其次,您可能有意以递归的方式编写firstvotel(),以供练习。但是,在我看来,如果以循环的形式编写,那么该方法更易于阅读:

    private static int firstVowel(String s) {
        int index = -1;
        for (int i = 0; i < s.length; ++i ) {
            if (isVowel(s.charAt(i)) {
                index = i;
                break;
            }
        }
        return index;
    }
    
    private static int first元音(字符串s){
    int指数=-1;
    对于(int i=0;i

    我相信这两个更改可以以更易读的方式使代码几乎减半。

    一个改进是将所有元音放在字符串常量中,并使用
    contains()
    检查字符是否为元音。此外,
    first元音(stringA,0)
    可以被提取到局部变量中,这将进一步提高可读性。你能澄清一下contains()方法的相关部分吗?我真的不明白如何将字符串常量、contains()和我正在检查的字符串联系起来。谢谢。我的意思是:
    私有静态最终字符串元音=“aeiouAEIOU”;
    ,然后在检查元音时,执行
    私有静态布尔值isvouel(char ch){返回元音.contains(String.valueOf(ch));}
    。它比大型
    if
    语句更容易阅读。
    static Set<Character> vowels = new HashSet<Character>(
            Arrays.asList('a','e','i','o','u','A','E','I','O','U'));
    
    if (vowels.contains(c)) {...}
    
    private static int firstVowel(String s) {
        int index = -1;
        for (int i = 0; i < s.length; ++i ) {
            if (isVowel(s.charAt(i)) {
                index = i;
                break;
            }
        }
        return index;
    }