我正在解决一个简单的问题:
在Java中删除字符数组的某些字符,这个想法很简单:
static void remove_char(char[] arr, char c){
int r = 0;
for (int i = 0 ; i < arr.length ; i++){
if (arr[i] == c){
r++;
continue;
}
arr[i - r] = arr[i];
}
arr[arr.length - r] = '\0'; // ??
return;
}
我想放一个ending character
来表示在我们想要的时候不必考虑数组的其余部分,例如,使用new String(arr)
生成一个字符串
Java中有这样的字符吗? (我猜在C
它是\0
,但我不确定)
例如,当我们打电话时:
System.out.println(new String(remove_char(new char[] {'s','a','l','a','m'} , 'a')))
将打印出来:slm m
虽然我想获得slm
而我想这样做in-place
不使用新数组
答案 0 :(得分:7)
Java没有像C那样“标记”字符串结尾。它跟踪长度&amp;值,因此字符串中可能有零个字符(\0
)。如果您从包含String
个字符的char数组创建\0
,则结果String
将包含这些字符。
另请注意,数组具有静态大小 - 无法重新调整大小,因此您必须自己跟踪“大小”(String构造函数不会从char的末尾删除不需要的字符)数组)。
考虑使用:
Clyde Byrd III建议的StringBuilder
,或
String(char value[], int offset, int count)
;您必须以编程方式确定offset
和count
的适当值。也许String方法,例如replace
,concat
或substring
可能会有所帮助。
答案 1 :(得分:2)
首先,String
不 a char[]
。 String
使用 char[]
,但仅此而已。
你所建议的是一个特殊字符的自定义解释,以标记一个char数组的“使用范围”,如果这是你为你的方法创建的合约,这很好。
所有字符都是java中的“有效”字符,但是正式保证unicode“非字符”永远不会用于编码字符:\uFDD0
到\uFDEF
,
\uFFFE
和\uFFFF
。
您可以考虑使用其中一种作为“范围结束”标记字符。