2014-01-31 49 views
1

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

 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

顺便说一句元音的数量:代替使用子串( i,i + 1),您可以简单地使用phrase.charAt(i)遍历字符串中的所有字符。这种方法提高了效率和可读性。 – mweisz

+0

so like: j = phrase.substring(i); ? – MrAwesome8

+0

其实更像是:j =“”+ phrase.charAt(i); – mweisz

回答

2

有几件事情会在这里:

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

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

  3. 现在,你的系统只能处理1 y和没有元音的单词。如果你输入“yyy”,你会得到1个元音。

从文体上看,还有很多其他更改可以使您的程序更易于阅读和调试。这里有几个:

当你检查布尔时,你不必做“== true”。例如,不是“if(y == true)”而是“if(y)”。

所有元音的处理方式都是一样的,所以你不需要为每个元素分开分支。例如,你可以有:

if (j.equalsIgnoreCase("a") 
    || j.equalsIgnoreCase("e") 
    || j.equalsIgnoreCase("i") 
    || ...) 
{ 
    vowels++; 
} 

事实上,你可以通过检查对元音值的集合,使用正则表达式,或在这种情况下,进一步简化这一点,只需使用包含:

boolean isAVowel = "aeiou".contains(j.toLowerCase()); 

考虑单独计数y,以便在3个单独的计数器中记录元音,ys和常量。然后,最后,您可以决定是将y添加到元音还是辅音。

最后,在调试阶段,将System.out.println("vowels = " + vowels + ", consonants = " + consonants + "...")添加到循环的内部。这将使它更容易看到发生了什么以及事情开始出错的地方。

+0

错字? '这几乎可以肯定你想要的' –

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(); 
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); 
+0

在你想要的位置添加'ys'到'元音字母'或'辅音' – SID

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