Java字符串处理疑问:移除空格、数字及特殊字符的函数异常原因排查
嘿,我来帮你搞清楚第二个代码出问题的原因~
咱们先拆解一下问题的核心:
问题根源:错误的数组赋值逻辑
你第二个代码里创建了一个和原字符串长度相同的arr2数组,但没有单独维护一个指针来记录arr2里该写字符的位置,而是直接用原数组的索引i来给arr2赋值。
举个例子,当遍历到原字符串里的空格(比如hello world!里的空格)时,Character.isLetter(' ')返回false,所以不会执行arr2[i] = ch;。这时候arr2[i]会保留char数组的默认值——'\u0000'(这是一个空字符,在很多场景下不会显示为可见字符,或者会被渲染成类似空格的效果)。
当你最后用String.valueOf(arr2)把数组转成字符串时,这个方法会把整个数组的所有元素(包括那些空字符)都转成字符串。所以最终的字符串长度和原字符串一样,只是非字母的位置被替换成了空字符,看起来就像空格还留在那里,而感叹号的位置变成了空字符所以看不到了。
而第一个代码是只把符合条件的字母拼接到新字符串里,最终字符串的长度就是所有字母的总数,没有多余的空字符,所以效果是对的。
怎么修正第二个代码?
只需要加一个变量来跟踪arr2的写入位置,比如j,每次找到字母就写入arr2[j],然后j自增。最后转字符串的时候,只取arr2里前j个有效字符就行:
public static String removeSpecialChars(String str) { char[] arr = str.toCharArray(); char[] arr2 = new char[str.length()]; int j = 0; // 专门用来记录arr2该写哪个位置 char ch; for (int i = 0; i < arr.length; i++) { ch = arr[i]; if (Character.isLetter(ch)) { arr2[j++] = ch; // 写入后移动指针 } } return new String(arr2, 0, j); // 只取有效字符部分 }
这样修改后,输出就和第一个代码完全一致啦~
内容的提问来源于stack exchange,提问作者Jonathan Gerard Joseph J
相关产品推荐
相关产品推荐

