Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pig拉丁语程序Java,元音输入问题_Java - Fatal编程技术网

Pig拉丁语程序Java,元音输入问题

Pig拉丁语程序Java,元音输入问题,java,Java,这是我在Java中尝试的一个简单的Pig拉丁词翻译程序。如果单词以辅音开头,则将辅音移到单词末尾,并添加“ay”。如果单词以元音开头,那么way将添加到单词的末尾。我很难理解为什么我的程序有元音问题 例如: 苹果被翻译成ppleaay而不是appleway 然而,van被翻译成了anvay public class PigLatin { public static String translate (String original) { String vowels =

这是我在Java中尝试的一个简单的Pig拉丁词翻译程序。如果单词以辅音开头,则将辅音移到单词末尾,并添加“ay”。如果单词以元音开头,那么way将添加到单词的末尾。我很难理解为什么我的程序有元音问题

例如:

苹果被翻译成ppleaay而不是appleway 然而,van被翻译成了anvay

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);
    }
} 
公共类
{
公共静态字符串转换(字符串原始){
字符串元音=“aeiouAEIOU”;
拉丁字符串=”;
for(int i=0;i<元音.length()-1;i++){
if(原.charAt(0)=元音.charAt(i)){
拉丁语=原文+方式;
}否则{
拉丁语=原始。子字符串(1)+原始。字符(0)+“ay”;
}
}
返回拉丁语;
}
公共静态void main(字符串[]args){
System.out.print(“要翻译的单词是什么:”);
String origWord=IO.readString();
字符串newWord=translate(origWord);
System.out.print(“翻译的单词是:“+新词”);
}
} 

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

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

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";
            }
    }
}

我假设输入至少有一个字符。

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

有几种方法可以解决这个问题。一种是在找到匹配项时提前终止循环。您可以使用break,但返回将更好。原因是,否则,您将为不匹配的字符构建一堆无用的结果。下面是一个使用
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";
}

正如@Aloso所指出的,您可能希望处理
原始
字符串以大写字母开头的情况稍微不同。例如,您可能希望
Van
变成
Anvay
,而不是
Anvay
。我建议使用类的、
toUpperCase(char)
和方法,而不是使用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
中的方法也意味着即使输入非拉丁字符,字符串也能正常工作。虽然在这种情况下它真的是猪拉丁语吗?

以辅音音节开头但包含多个辅音的单词呢?例如,
chameleon
将成为
ameleonchay
@TimBiegeleisen Pig拉丁语无论如何都不是一种真正的语言。我认为hameloncay是可以接受的。这是很多新程序员犯的错误。。。在检查所有元音之前,不应执行要添加的代码
“ay”
。因此,该代码必须在循环之外(循环完成后),而不是在循环内部。您是否尝试使用代码运行调试器?使用一步一步的调试并在每一步检查变量,以了解出了什么问题。我已尝试运行调试器,但我不完全确定如何使用它,我仍在学习,但我知道它非常有用。您的推理似乎不正确,并且在这种情况下切换不是最佳的。为什么您的完整示例在
default
案例中有一个
if
语句?if是必要的,因为switch语句有大小写(word->ordway、word->ordway等):在这种情况下,switch是一个很好的解决方案,因为它不需要循环。开关通常使用查找表实现,查找表比循环中的if快得多。除此之外,它更直观。您可以立即看到代码的作用。
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";
}
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";