Pig Latin Program Java,元音输入问题

时间:2017-03-29 02:54:19

标签: java

这是我在Java中使用简单的Pig Latin Word Translator的尝试。如果单词以辅音开头,则辅音移动到单词的末尾并添加“ay”。如果单词以元音开头,那么方法将添加到单词的结尾。我很难理解为什么我的程序存在元音问题。

示例:

apple被翻译为ppleaay而不是appleway 然而,面包车被翻译成了它应该的样子。

public class PigLatin 
{
    public static String translate (String original) {
        String vowels = "aeiouAEIOU";
        String latin = "";
        for (int i = 0; i < vowels.length() - 1; i++) {
            if (original.charAt(0) == vowels.charAt(i)) {
                latin = original + "way";
            }else {
                latin = original.substring(1) + original.charAt(0) + "ay";
            }
        }
        return latin;
    }

    public static void main(String[] args) {

        System.out.print("What is the word to be translated: ");
        String origWord = IO.readString();
        String newWord = translate(origWord);
        System.out.print("The translated word is: " + newWord);
    }
} 

2 个答案:

答案 0 :(得分:0)

问题是if位于for循环内部。您希望else分支仅在第一个字符既不是'a'也不是'e'也不是'i'等时执行。

这是获得正确结果的更简单方法:

public static String translate(String original) {
    switch (original.toLowerCase().charAt(0)) { // transform to lowercase to simplify code
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
            return original + "way";
        default:
            return original.substring(1) + original.charAt(0) + "ay";
    }
}

如果必须正确转换大写单词:

public static String translate(String original) {
    switch (original.toLowerCase().charAt(0)) { // transform to lowercase to simplify code
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
            return original + "way";
        default:
            if (original.charAt(0) >= 'a' || original.length() == 1) {
                // lowercase word or word with only 1 character
                return original.substring(1) + original.charAt(0) + "ay";
            } else {
                // uppercase, at least 2 characters
                String first = "" + original.charAt(0);
                String second = "" + original.charAt(1);
                String rest = original.substring(2);
                return second.toUpperCase() + rest + first.toLowerCase() + "ay";
            }
    }
}

我认为输入至少有一个字符。

答案 1 :(得分:0)

你的循环将循环遍历每个元音,而不会在找到匹配时停止。基本上,最后一个测试是唯一重要的测试,因为apple不是以U开头,所以会得到意想不到的结果。

有几种方法可以解决这个问题。一种是如果找到匹配就提前终止循环。你可以使用休息,但return会更好。原因是你最终会为非匹配字符构建一堆无用的结果。以下是使用return

的示例
public static String translate (String original) {
    String vowels = "aeiouAEIOU";
    for (int i = 0; i < vowels.length() - 1; i++) {
        if (original.charAt(0) == vowels.charAt(i)) {
            return original + "way";
        }
    }
    return original.substring(1) + original.charAt(0) + "ay";
}

另一种可能更好的方法是使用内置的String方法之一检查单词的第一个字符是否在元音列表中,而不是重新发明轮子。一些显而易见的选项是String.indexOf(int)String.contains(CharSequence)。以下是如何使用这些方法的示例:

public static String translate (String original) {
    String vowels = "aeiouAEIOU";
    if(vowels.contains(original.substring(0, 1))) {
        return original + "way";
    }
    return original.substring(1) + original.charAt(0) + "ay";
}

public static String translate (String original) {
    String vowels = "aeiouAEIOU";
    if(vowels.indexOf(original.charAt(0)) >= 0) {
        return original + "way";
    }
    return original.substring(1) + original.charAt(0) + "ay";
}

正如@Aloso指出的那样,你可能想要处理你的original字符串以大写字母开头有点不同的情况。例如,您可能希望Van成为Anvay,而不是anVay。我建议使用isUpperCase(char)类的toLowerCase(char)toUpperCase(char)Character方法,而不是使用ASCII代码。如果您需要此功能,请在上述任何示例中使用以下内容替换行return original.substring(1) + original.charAt(0) + "ay";

if(Character.isUpperCase(original.charAt(0))) {
    return Character.toUpperCase(original.charAt(1)) + original.substring(2) + Character.toLowerCase(original.charAt(0)) + "ay";
}
return original.substring(1) + original.charAt(0) + "ay";

使用Character中的方法也意味着即使输入非拉丁字符,字符串也会正常运行。虽然在那种情况下真的是猪 - 拉丁语吗?