Java元音统计函数输入空字符串返回1而非0的原因及优化咨询
空字符串统计元音返回1的问题原因及优化方案
问题原因
当传入空字符串""时,str.split("")会生成一个长度为1的数组,数组里唯一元素是空字符串""。
循环中vowels.contains(chr)判断"aeiou"是否包含空字符串——Java里任何字符串都默认包含空字符串作为子串,所以这个判断返回true。原代码没过滤空字符串,导致answer加1,最终返回1而非0。
更优方案
方案1:直接遍历字符(最简洁高效)
跳过拆分字符串的步骤,直接遍历每个字符判断是否为元音:
public static int getCount(String str) { String vowels = "aeiou"; int answer = 0; for (char c : str.toCharArray()) { if (vowels.indexOf(c) != -1) { answer++; } } return answer; }
如果用Java 8及以上版本,也可以用Stream简化写法:
public static int getCount(String str) { return (int) str.chars() .mapToObj(c -> (char) c) .filter(c -> "aeiou".contains(String.valueOf(c))) .count(); }
方案2:修复原逻辑的判断问题
如果想保留拆分字符串的写法,需要修正几个细节:
- 字符串内容相等要用
equals(),!=判断的是对象引用而非内容; - 用短路与
&&替代&,前面条件不满足时不会执行后面判断,提升效率; - 提前判断空字符串,避免不必要的循环:
public static int getCount(String str) { if (str.isEmpty()) { return 0; } String vowels = "aeiou"; int answer = 0; String[] strArray = str.split(""); for (String chr : strArray) { if (vowels.contains(chr) && !chr.isEmpty()) { answer++; } } return answer; }
内容的提问来源于stack exchange,提问作者Bozo_programmer
相关产品推荐
相关产品推荐

