我制作了一个程序来计算输入字符串中元音和辅音的数量:
Scanner in = new Scanner(System.in);
System.out.print("Enter a string ");
String phrase = in.nextLine();
int i, length, vowels = 0;
int consonants = 0;
boolean y = false;
String j;
length = phrase.length();
for (i = 0; i < length; i++)
{
j = "" + phrase.charAt(i);
boolean isAVowel = "aeiou".contains(j.toLowerCase());
boolean y = "y".contains(j.toLowerCase());
if(isAVowel){
vowels++;
}else if(isAVowel && y){
vowels++;
consonants++;
//}else if(y && !(isAVowel)){
// vowels++;
}else{
consonants++;
}
System.out.println("The number of vowels in \"" +phrase+"\" is "+ vowels+".\n\nThe number of consonants is "+consonants+".\n\n");
当“y”本身表示它是一个辅音时,它应该是一个元音。我在哪里说明这一点?
答案 0 :(得分:2)
这里有几件事情发生了:
j.equalsIgnoreCase(“a,e,i,o,u”)将检查j(长度为1的字符串)是否为字符串“a,e,i,o,u”,这几乎是当然不是你想要的(因为它总是假的,因此你为每个辅音设置y = true)。相反,请考虑在每次迭代开始时将布尔值设置为false,并在元音分支中将其设置为true。然后,如果该变量为真,那么你知道这次你看到了一个元音。或者只是拥有else分支。
在循环外部将y初始化为false,但是一旦y为真,它就永远不会被重置,因此对于每个字母,您将运行if(y == true)块。
目前,您的系统仅考虑1年且没有元音的单词。如果你输入“yyy”,你将获得1个元音和1个元音。 2个辅音。
在风格上,您可以进行许多其他更改,以使您的程序更易于阅读和调试。以下是一些:
检查bool时,您不必执行“== true”。例如,代替“if(y == true)”只需执行“if(y)”。
所有元音的处理方式都相同,因此每个元音都不需要单独的分支。例如,您可以:
if (j.equalsIgnoreCase("a")
|| j.equalsIgnoreCase("e")
|| j.equalsIgnoreCase("i")
|| ...)
{
vowels++;
}
事实上,您可以通过使用正则表达式检查元音值的集合来进一步简化此操作,或者在这种情况下,只需使用contains:
boolean isAVowel = "aeiou".contains(j.toLowerCase());
考虑单独计算y,因此您可以在3个单独的计数器中跟踪元音,y和常量。然后,最后你可以决定是否将ys添加到元音或辅音。
最后,在调试阶段向循环内部添加System.out.println("vowels = " + vowels + ", consonants = " + consonants + "...")
。这样可以更容易地看到发生了什么以及事情何时开始出错。
答案 1 :(得分:1)
也许你应该只使用正则表达式
String phrase = in.nextLine();
int consonants = phrase.replaceAll("a|e|o|u|i", "").length();
int vowels = phrase.replaceAll("[^a|e|o|u|i|y]", "").length();
答案 2 :(得分:1)
我无法理解你想用'y'做什么,所以单独计算它们。 首先需要从输入中删除所有非单词字符。
我修改了你的代码(虽然还没有优化):
System.out.print("Enter a string: ");
String origphrase = new Scanner(System.in).nextLine();
String phrase = origphrase.replaceAll("\\W","");
int i, length, vowels = 0;
int consonants = 0;
int ys=0;
String j;
length = phrase.length();
for (i = 0; i < length; i++)
{
j = "" + phrase.charAt(i);
boolean isAVowel = "aeiou".contains(j.toLowerCase());
boolean y = "y".contains(j.toLowerCase());
if(isAVowel){
vowels++;
}else if(y){
ys++;
}else{
consonants++;
}
}
System.out.println("Phrase:"+origphrase);
System.out.println("Vowels:"+vowels);
System.out.println("Consonants:"+consonants);
System.out.println("Y's:"+ys);
答案 3 :(得分:0)
以下递归函数返回输入字符串中的元音数
public static int vc(String s){
if(s.length() - 1 < 0) return 0;
return ((("aeiou".indexOf((s.charAt(s.length()-1)+"").toLowerCase()) >= 0 ? 1 : 0))
+ vc((s = s.substring(0,s.length()-1))));
}