我正在研究一个猪拉丁语翻译器,它将给定的单词翻译成猪拉丁语。这是猪拉丁方法和isVowel方法。
public static void pigLatin(String s) {
char[] array = s.trim().toCharArray();
if(isVowel(s.charAt(0)) && !Character.toString(s.charAt(0)).equalsIgnoreCase("y")){
System.out.println(s+"way");
}else {
int i = 0;
String toReturn = "";
do {
toReturn += array[i];
i++;
}while(!isVowel(s.charAt(i)) && !Character.toString(array[i]).equalsIgnoreCase("y"));
System.out.println(s.substring(i)+toReturn+"ay");
}
}
public static boolean isVowel(char c) {
char[] vowels = new char[] {'a','e','i','o','u','y'};
for(int i = 0;i<vowels.length;i++) {
if(Character.toString(vowels[i]).equalsIgnoreCase(Character.toString(c))) {
return true;
}
}
return false;
}
问题是当我输入单词“BIrD”和“quiet”时。第一个抛出java.lang.StringIndexOutOfBoundsException: String index out of range: 4
第二个没有正确转换。安静打印uietqay,当它假设是ietquay,但这没有意义,因为,你应该把所有常数带到元音,这应该意味着uietquay所以为什么它是ietquay?有人可以指点我正确的方向吗?
注意:这不是作业。
答案 0 :(得分:2)
无视案例,这是“BLRD”还是“鸟”?因为如果它没有元音,那么你的do-while循环不会因为越界而终止。
你的第二种情况,“安静”应该是“uietqay”,除非你想添加特殊的逻辑来保持“qu”在一起。你可以通过使它变得更加丑陋来实现这一目标:
while( (!isVowel(s.charAt(i)) || isQU(s, i)) && !Character.toString(array[i]).equalsIgnoreCase("y"))
然后实施适当的isQU(String s, int index)
。
但我建议稍微改写一下是为了让你的代码更具可读性。因此,我不太确定为什么你的isVowel
检查“y”而你的while条件也会检查“y”。有些时候您使用array[i]
,有些时候使用charAt(i)
。这种不一致使得您的代码难以阅读而几乎没有任何好处。
答案 1 :(得分:1)
public static String pigLatin(String a){
a=a.toLowerCase();
String [] x=a.split(" ");
int vowl=0;
String c="";
String d="";
String trans="";
for(int i=0; i<x.length; i++){
for(int j = 0;j<x[i].length();j++){
if(x[i].charAt(j)=='a'||x[i].charAt(j)=='e'||x[i].charAt(j)=='i'||x[i].charAt(j)=='o'||x[i].charAt(j)=='u'){
vowl=j;
j=x[i].length();
}
}
c=x[i].substring(0,vowl);
d=x[i].substring(vowl,x[i].length());
trans+= d+c+"ay ";
}
return trans;
}