用辅音计数元音

时间:2014-01-31 00:43:53

标签: java string count

我制作了一个程序来计算输入字符串中元音和辅音的数量:

        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”本身表示它是一个辅音时,它应该是一个元音。我在哪里说明这一点?

4 个答案:

答案 0 :(得分:2)

这里有几件事情发生了:

  1. j.equalsIgnoreCase(“a,e,i,o,u”)将检查j(长度为1的字符串)是否为字符串“a,e,i,o,u”,这几乎是当然不是你想要的(因为它总是假的,因此你为每个辅音设置y = true)。相反,请考虑在每次迭代开始时将布尔值设置为false,并在元音分支中将其设置为true。然后,如果该变量为真,那么你知道这次你看到了一个元音。或者只是拥有else分支。

  2. 在循环外部将y初始化为false,但是一旦y为真,它就永远不会被重置,因此对于每个字母,您将运行if(y == true)块。

  3. 目前,您的系统仅考虑1年且没有元音的单词。如果你输入“yyy”,你将获得1个元音和1个元音。 2个辅音。

  4. 在风格上,您可以进行许多其他更改,以使您的程序更易于阅读和调试。以下是一些:

    检查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))));
}