为什么Java会在While循环中跳过我的If语句?

时间:2015-08-04 05:29:44

标签: java if-statement while-loop syntax-error

我试图构建一个计算给定字符串中元音量的程序。一切似乎都运行正常,直到我进入while循环。它完全跳过我的if语句并直接进入整数r的增量。我觉得这是一个语法错误;但是,我无法想象它会是什么。有什么想法吗?

String e [] = {"a", "e", "i", "o", "u"};
String a = "banana";
int r = 0;
int b = 0;
int c = 1;
int z = 0;
String q = " ";
for(int i = 0; i < a.length(); i++) {
    q = a.substring(b, c);
    b++;
    c++;
    while(r < e.length) {
        if(q.equalsIgnoreCase(e[r])){
            z = z + 1;
        }
        r++;
    }   
}
System.out.println(z);

4 个答案:

答案 0 :(得分:1)

首先,您需要在r循环之前或之后将while重置为零。

接下来简化代码。如果您想知道String中有多少个元音,可以使用String.replaceAll(String regex, String replacement)删除String中所有非元音字母,然后移除String的长度将等于你有多少个元音。

public static void main(String[] args) {
    String a = "banana";
    System.out.println(a.replaceAll("[^aeiouAEIOU]", "").length());
}

结果:

3

regex中的replaceAll()模式表示匹配任何不是大写/小写元音(Regex Pattern Reference)的字符,并将其替换为空字符串(将其删除) )。结果是一个新的String,其中只有元音。

如果regex过于复杂而无法理解,那么就像你正在做的那样走String,但检查每个字符是否是这样的元音:

public static void main(String[] args) {
    String vowels = "aeiouAEIOU";
    String a = "banana";

    int vowelCount = 0;
    for (int i = 0; i < a.length(); i++) {
        String letter = Character.toString(a.charAt(i));
        if (vowels.contains(letter)) {
            vowelCount++;
        }
    }

    System.out.println(vowelCount);
}

您无需使用String.substring()来提取单个字符,这就是String.charAt()的用途。另外,如果没有array个元音,可以使用String个元音,这样您就可以使用String.contains()查看该字母是否为元音。

正如您所看到的,有很多方法可以构建算法来解决这个问题。选择对你最有意义的东西并帮助你学习。

答案 1 :(得分:0)

尝试这样

    String e [ ] = {"a", "e", "i", "o", "u"};
    String a = "banana";
    int r = 0;
    int b = 0;
    int c = 1;
    int z = 0;
    String q = " ";
    for(int i = 0; i < a.length(); i++){
        q = a.substring(b, c);
        b++;
        c++;
        r=0;
        while(r < e.length() ){
            if(q.equalsIgnoreCase(e [r])){
                z = z + 1;

            }
            r++;
        }

    }
    System.out.println(z);

我每次都将r设置为0,我在&#34; u&#34;之后删除了一个逗号,然后在a.length之后添加了括号,并在a.length()之后删除了-1。

将r设置为0是必要的,因为r表示您要测试的元音中的哪一个。因此,对于单词中的每个字母,您正在测试每个元音。因此,在测试了每个字母(香蕉)之后,你必须将r设置为0,以便它开始检查&#34; a&#34;再次(然后我...)。然后它继续前进到香蕉中的下一个字母,所以它需要回到&#34; a&#34;试。

并且需要使用e.length()而不是length()-1,否则它将永远不会测试&#34; u&#34; 。它恰好起作用,因为香蕉没有&#34; u&#34;&#39;

答案 2 :(得分:0)

您需要在for循环中重置r = 0

for (int i = 0; i < a.length(); i++) {
    q = a.substring(b, c);
    b++;
    c++;
    r = 0;
    while (r < e.length - 1) {
        if (q.equalsIgnoreCase(e[r])) {
            z = z + 1;
        }
        r++;
    }
}

如果你没有将 r重置为0 ,那么当第一次循环执行时,你将会将 r的值结束为(对于字符b) 。因此,当下次执行for循环时,r的值为4,因此每次检查此条件while (4 < e.length - 1)时都会导致错误,并且不会进入while循环。因此,如果是banana,则会在b时执行,但对剩余的字符anana不执行。

如果您使用的是任何IDE,那么您可以调试代码并查看值的变化情况。

对于 Eclipse Debugging With Eclipse

答案 3 :(得分:0)

首先在共享时将代码格式化为对他人的帮助。 以下是正在运行的代码。你应该运行它并修复添加到数组e的逗号。 只需重置r索引即可修复它。

这是JDK 8版本

import java.util.*;

class Tester{
  public static void main(String args[]){
    String vowels [ ] = {"a", "e", "i", "o", "u"};
    String word = "bananae";

    int vowelCount = 0;
    Object[] vowelsInTheWord = Arrays.stream(vowels).filter(l -> word.indexOf(l) > -1).toArray();
    System.out.println(vowelsInTheWord.length);
  }
}

并修复了您的版本

class Tester{
  public static void main(String args[]){
    String e [ ] = {"a", "e", "i", "o", "u"};
    String a = "banana";
    int r = 0;
    int b = 0;
    int c = 1;
    int z = 0;
    String q = " ";
    for(int i = 0; i < a.length(); i++){
      q = a.substring(b, c);
      b++;
      c++;

      r = 0;

      while(r < e.length){
        if(q.equalsIgnoreCase(e [r])){
           z = z + 1;
        }
        r++;
      }
    }
    System.out.println(z);
  }
}