Java实现字符串指定字母移除(保留非字母、不修改原串)问题排查
代码错误点说明
- 循环逻辑写崩了:遍历
arg字符的for循环里,只要遇到第一个非数字字符就直接return result,后续所有逻辑都不会执行。比如传参ra6时,第一次循环碰到非数字的r就直接返回字符串"r",根本不会处理后面的a。 - 过滤规则理解错了:需求是只有arg里的字母才需要作为移除依据,非字母(数字、标点等)完全不用管,你现在只过滤了数字,标点符号会被当成要移除的内容;而且你用
replaceAll(result,"")是匹配完整子串替换,不是逐个删除字符,完全达不到逐字符移除的效果。 - 语法使用错误:判断空字符串用了
==,Java中字符串值比较必须用equals()方法,==比较的是对象内存地址,很容易出现判断失效的问题;另外你还写了this.myString=""直接修改成员变量,违反了「不得修改原myString内容」的要求。 - 没做大小写兼容:需求明确要求字母匹配不区分大小写,现有代码完全没处理大小写转换,大写和小写的同字母会匹配失败。
正确实现代码
实现逻辑:
- 先遍历
arg,把里面所有字母字符统一转成小写,存到Set集合里作为待移除字符清单,所有非字母字符直接跳过,不加入清单 - 如果待移除清单是空的,直接返回原字符串即可
- 逐字符遍历原
myString,每个字符转小写后判断是否在待移除清单里,不在的话就拼接到结果串里,全程不修改原成员变量的值
import java.util.HashSet; import java.util.Set; public class StringProcessor { private String myString; public StringProcessor(String myString) { this.myString = myString; } public String remove(String arg) { // 原串为空直接返回空字符串 if (myString == null || myString.isEmpty()) { return ""; } // 收集所有需要移除的字母(统一转小写,实现不区分大小写匹配) Set<Character> removeChars = new HashSet<>(); for (char c : arg.toCharArray()) { if (Character.isLetter(c)) { removeChars.add(Character.toLowerCase(c)); } } // 没有需要移除的字母,直接返回原串 if (removeChars.isEmpty()) { return myString; } // 逐字符拼接结果,不修改原myString StringBuilder result = new StringBuilder(); for (char c : myString.toCharArray()) { if (!removeChars.contains(Character.toLowerCase(c))) { result.append(c); } } return result.toString(); } // 测试验证 public static void main(String[] args) { StringProcessor processor = new StringProcessor("my lucky numbers are 6, 8, and 19."); // 测试用例1 输出:my lucky numbes e 6, 8, nd 19. System.out.println(processor.remove("ra6")); // 测试用例2 输出原串:my lucky numbers are 6, 8, and 19. System.out.println(processor.remove("6,.")); } }
内容的提问来源于stack exchange,提问作者roxyrox
相关产品推荐
相关产品推荐

