目前,我正在处理一个项目,该项目需要删除字符串中设置位置的字符。有简单的方法吗?
使用StringBuilder,它具有方法deleteCharAt()
。然后,您可以使用stringBuilder.toString()
来获取您的字符串。
EDIT,这里有一个例子:
public static void main(String[] args) {
String string = "bla*h";
StringBuilder sb = new StringBuilder(string);
sb.deleteCharAt(3);
// Prints out "blah"
System.out.println(sb.toString());
}
字符串是不可变的!但是为了完成你的任务,你可以
- 将子字符串从字符串开头复制到必须删除的字符
- 将必须删除的字符的子字符串复制到字符串的末尾
- 将第二个字符串附加到第一个字符串上
例如,假设您必须删除第三个字符:
String input = "Hello, World";
String first = input.substring(0, 3);
String second = input.substring(4);
String result = first + second;
您可以将字符串转换为StringBuilder
,后者具有方便的deletaCharAt
方法。
String strWithoutChar = new StringBuilder(yourString).deleteCharAt(yourIndex).toString();
但请记住,这使您能够删除一些样板代码,但使用String#substring
方法会占用更多内存。
这样做的方法是将旧字符串复制到新闻字符串中,小心删除一个字符,如下所示:
String newString = oldString.substring(0, index) + oldString.substring(index+1);
请记住,如果您多次这样做,那么不断地生成新字符串是相当低效的。
无论其他学者在这里说什么,我都同意他们的看法,这给出了正确的答案。但是,如果你正在处理一个生产级别的程序,每个漏洞都会被放大,我建议你不要使用字符串的"子字符串"方法,因为:
(1) 。substring方法实际上为垃圾收集器保留了未标记的父字符串。由于此垃圾收集器无法在其进程中对其进行清理,因此堆空间会被占用,即使未使用,未使用的父字符串仍然存在于堆空间中。
(2) 。如果处理大量这样的字符串操作,最终可能会导致"堆内存不足"异常,这在程序的任何时间点都是不可取的。
使用字符数组及其操作来实现您想要的:
public static void fn1()
{
String a = "Stack Overflow";
char[] b = a.toCharArray();
j // index position of the character that you want to delete
for(int i=j;i<b.length-1;i++)
{
b[i]=b[i+1];
}
b[b.length-1]=' 00'; // ' 00' is the null character
System.out.println(new String(b));
}
另一种选择是使用子字符串方法,但使用concat而不是+
String removeCharAt(String s, int index) {
return s.substring(0, index).concat(s.substring(index + 1));
}