📅  最后修改于: 2023-12-03 15:28:01.459000             🧑  作者: Mango
在编程中,计算字符串中元音的数量是一个非常基本的需求。在这个问题中,我们需要会计算一个字符串中元音字母a,e,i,o和u的数量。
第一种解法是使用暴力遍历字符串,检查每个字符是否是元音字母。如果是,将计数器加一。具体实现可以参考以下代码:
public static int countVowel1(String s) {
int count = 0;
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch == 'a' || ch == 'A' || ch == 'e' || ch == 'E' ||
ch == 'i' || ch == 'I' || ch == 'o' || ch == 'O' ||
ch == 'u' || ch == 'U') {
count++;
}
}
return count;
}
可以看到,这段代码使用了一个计数器count,遍历字符串s的每个字符,逐一检查是否是元音字母。如果是,计数器count加1。最终,函数返回count的值,即元音字母出现的总次数。
另一种解法是使用正则表达式,匹配元音字母的正则表达式可以写成"[aeiouAEIOU]"。实现代码如下:
public static int countVowel2(String s) {
String regex = "[aeiouAEIOU]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(s);
int count = 0;
while (matcher.find()) {
count++;
}
return count;
}
这段代码使用java.util.regex包中的类来匹配正则表达式,具体使用方法与java中使用正则表达式的方法类似。matcher.find()会在字符串s中查找符合正则表达式的下一个子序列。如果找到了,计数器count加一。最终,函数返回count的值,即元音字母出现的总次数。
我们可以编写一个简单的测试程序来测试上述两种解法的性能。程序如下:
public static void main(String[] args) {
String s = "Calculating the number of vowels in string in Java.";
int n = 1000000;
long start1 = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
countVowel1(s);
}
long end1 = System.currentTimeMillis();
System.out.println("方法1:" + (end1 - start1) + "ms");
long start2 = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
countVowel2(s);
}
long end2 = System.currentTimeMillis();
System.out.println("方法2:" + (end2 - start2) + "ms");
}
我们分别使用方法1和方法2计算字符串s中字符的数量,并比较它们的运行时间。在我的电脑上运行1000000次的测试程序,结果如下:
方法1:503ms
方法2:1192ms
可以看到,暴力遍历的方法比正则表达式的方法要快很多,前者只需要503ms,而后者需要1192ms。因此,在实际编程中,如果需要计算字符串中元音的数量,我们应该优先选择暴力遍历的方法。