【发布时间】:2021-04-23 21:24:08
【问题描述】:
我正在编写一个函数来从作为参数传递的字符串中删除空格。
此代码有效:
public static String removeSpecialChars(String str) {
String finalstr = "";
char[] arr = str.toCharArray();
char ch;
for (int i = 0; i < arr.length; i++) {
ch = arr[i];
if (Character.isLetter(ch))
finalstr = finalstr.concat(String.valueOf(ch));
else
continue;
}
return finalstr;
}
字符串 'hello world!' 的输出如下:
helloworld
但是这个没有:
public static String removeSpecialChars(String str) {
char[] arr = str.toCharArray();
char[] arr2 = new char[str.length()];
char ch;
for (int i = 0; i < arr.length; i++) {
ch = arr[i];
if (Character.isLetter(ch))
arr2[i] = ch;
}
return String.valueOf(arr2);
}
输出:
hello world
我得到与输出相同的字符串,但只删除了感叹号。这可能是什么原因?任何帮助将不胜感激。
【问题讨论】:
-
arr2[i] = ch;您需要第二个索引(例如int j = 0;)来跟踪将字母添加到新数组的位置。arr2[j++] = ch; -
你可以使用一个简单的正则表达式:
return str.replaceAll("[^a-zA-Z]", ""); -
多项小改进可用: 1) 如果您构建一个字符串,请使用 StringBuilder(快速)或 StringBuffer(线程安全)。这将极大地提高更长(30 多个字符)字符串的速度。 2) 如果您遍历数组的所有元素并且不需要索引,请使用 for-each 循环。因此,不是写
for (int i = 0; i < arr.length; i++) {ch=arr[i]; ...},而是在第一个代码示例中写for (char ch: arr) {}3),而是在循环外定义ch,即使它只在循环内部使用。最好只在循环内定义。 ` { char ch = arr[i];` 更好,防止混淆并释放 varnames -
arr2 由
(char)0(\u0000') 字符初始化,对于非字母,这些字符保留在数组中。输出有误导性,因为还有 12 个字符,并且“空格”不是空格' '。
标签: java arrays string character special-characters