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