这是我在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);
}
}
答案 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
中的方法也意味着即使输入非拉丁字符,字符串也会正常运行。虽然在那种情况下真的是猪 - 拉丁语吗?