2

我制作了这个简单的 GUI 程序来计算特定字符序列的元音和辅音。计数器没问题,但是我遇到了 if-else 语句的问题,当该字符既不是元音也不是辅音时,我必须显示一条消息......这是代码:

//I initialized these variables:

    public static int vowels = 0, consonants = 0, charac = 0;
    public static String outputStr;
    public static String conso = "bcdfghjklmnpqrstvwxyz";
    public static String vow = "aeiou";

    //Here's the code for my "count" button
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

        String userInput = jTextField1.getText();
        userInput = userInput.toUpperCase();
        conso = conso.toUpperCase();
        vow = vow.toUpperCase();
        String wordInput[] = userInput.split("");

        vowels = 0;
        consonants = 0;
        charac = 0;

        for(int i=0; i<wordInput.length; i++) {
            for(int j=0; j<5; j++) {
                char v = vow.charAt(j);
                String VL = Character.toString(v);
                if(VL.equals(wordInput[i])) {
                    vowels ++;
                    charac = 0;}
                else {
                    charac += 1; }
                }

            for(int h=0; h<21; h++) {
                char c = conso.charAt(h);
                String CL = Character.toString(c);
                if(CL.equals(wordInput[i])) {
                    consonants ++;
                    charac = 0; }
                else {
                    charac += 1; }
            }

        }

        String totalVow = Integer.toString(vowels);
        String totalCons = Integer.toString(consonants);

        jLabel5.setText(totalVow);
        jLabel6.setText(totalCons);


    //here's the if-else statement:

        if (charac == 0) {
            jLabel7.setText(" ");
        }
        else if (charac >= 1) {
            jLabel7.setText("The sequence contains invalid characters.");
        }
        if (userInput.isEmpty()) {
            jLabel7.setText("No input.");
        }
}

这是它的样子:

在此处输入图像描述

我输入了一个没有任何特殊字符或数字的字符“序列”。但它仍然显示消息,其中包含元音和辅音以外的其他字符。if-else 语句有问题吗?谢谢您的帮助 :)

4

4 回答 4

4

问题出在内部 for 循环中。每个字符都用 5 个不同的元音中的每一个进行了测试,所以它肯定不会匹配其中至少 4 个,并且charac会递增

for(int j=0; j<5; j++) {
    char v = vow.charAt(j);
    String VL = Character.toString(v);
    if(VL.equals(wordInput[i])) {
        vowels ++;
        charac = 0;}
    else {
        charac += 1;
    }
}

相反,您可以使用 String.contains() 方法代替内部循环。

于 2013-09-28T16:17:46.217 回答
3

您将不相关的代码放入循环中。你的循环应该像:

 for(int i=0; i<wordInput.length; i++) {
   char ch=wordInput.charAt(i);
   if(Character.isLetter(ch)){
     if(isVowel(ch)){// make a method which return true if char is vowel.
      vowel++;
     }
     else{
     consonent++;
     }
   }
 }
于 2013-09-28T16:19:08.160 回答
2

charac在两个循环中都添加了:一个查找辅音,另一个查找元音。您想在此处使用 if/else-if/else,仅当字符不是辅音或添加到charac.

另外,看看 Guava 实用程序。例如,这是获得所有元音和所有辅音的方法:

String vowels = "aeiou";
String consonants = "bcdfghjklmnpqrstvwxz";
String input = "mary had a little lamb";
String allVowels = CharMatcher.anyOf(vowels).retainFrom(input);
String allConsonants = CharMatcher.anyOf(consonants).retainFrom(input);
于 2013-09-28T16:17:04.757 回答
2

如果错误,您计算无效字符的逻辑。您所做的是:每次字符不是您刚刚测试的字符时都增加计数器,即对于您输入的每个字符,charac变量增加25倍!但是,下一次字符匹配当前测试的元音或辅音时,您将变量重置为 0!charac

您可以使用内置的 String 方法来检查当前字符是否是元音或辅音之一,而不是使用两个for循环来单独检查每个元音和辅音,例如indexOf. 这样,每个检查都减少为一个 if 语句,从而更容易在它既不是元音也不是辅音的情况下使用“else”情况。

for (int i = 0; i < userInput.length(); i++) {
    char c = userInput.charAt(i);
    if (vow.indexOf(c) != -1) {
        vowels++;
    } else if (conso.indexOf(c) != -1) {
        consonants++;
    } else {
        charac++; // invalid character
    }
}

charAt另外,请注意,您也可以使用该方法,而不是将字符串拆分为字符串数组。

于 2013-09-28T16:34:23.403 回答