我试图构建一个计算给定字符串中元音量的程序。一切似乎都运行正常,直到我进入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);
答案 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);
}
}