使用for循环移除字符串中非单词首字母的元音字母实现问题
代码问题梳理
- 循环起始索引错误:从
i=1开始遍历直接丢弃了整个字符串的第一个字符,也就是第一个单词的首字母,不符合保留单词首字母的规则 Character.isWhitespace(i)参数错误:该方法需要传入字符做判断,你传入的是索引值i,判断逻辑完全失效- 语法错误:
rtn += (char)(msg.charAt(i - 1);缺少右闭合括号,本身就无法正常编译 - 取字符逻辑错误:
msg.valueOf(i)是将索引数值i转为字符串,不是取当前索引对应的字符,正确写法是String.valueOf(msg.charAt(i)) - 核心逻辑完全颠倒:需求是仅删除非首字母位置的元音,其余所有字符都要保留,但当前代码仅把元音字符追加到结果,所有辅音字符直接被丢弃
- 缺失单词首字母标记逻辑:没有判断当前字符是否是单词的首字母位置,无法区分当前位置的元音是否需要保留
修正后实现代码
public static final String VOWELS = "aeiouAEIOU"; public static String stringCompress(String msg){ if (msg == null || msg.isEmpty()) { return ""; } StringBuilder rtn = new StringBuilder(); // 标记下一个字符是否是单词首字母 boolean isNewWord = true; for (int i = 0; i < msg.length(); i++) { char curr = msg.charAt(i); if (isNewWord) { // 单词首字母直接保留 rtn.append(curr); isNewWord = false; } else if (Character.isWhitespace(curr)) { // 空白字符直接保留,下一个字符是新单词首字母 rtn.append(curr); isNewWord = true; } else { // 非首字母非空白,仅保留非元音字符 if (!VOWELS.contains(String.valueOf(curr))) { rtn.append(curr); } } } return rtn.toString(); }
以输入bear if为例,运行后输出为ber if,符合规则:bear的首字母b直接保留,第二位e、第三位a都是非首字母位置的元音直接删除,第四位r保留;空格直接保留,if的首字母i是元音也保留,第二位f保留。
内容的提问来源于stack exchange,提问作者Emma Shneidman
相关产品推荐
相关产品推荐

