2

我正在解决一个简单的问题:

在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 characterwhich 表示当我们想要生成字符串时不必考虑数组的其余部分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

4

2 回答 2

7

Java 不像 C 那样“标记”字符串的结尾。它跟踪长度和值,因此\0字符串中可能包含零字符 ( )。如果您String从包含\0字符的 char 数组创建一个,则结果String将包含这些字符。

另请注意,数组具有静态大小 - 它无法重新调整大小,因此您必须自己跟踪“大小”(String 构造函数不会从 char 数组的末尾为您删除不需要的字符)。

考虑使用:

  • AStringBuilder由 Clyde Byrd III 建议,或

  • String(char value[], int offset, int count); 您必须以编程方式确定合适的值offsetcount将是什么。也许 String 方法,例如replace, concat, orsubstring可能会有所帮助。

于 2013-07-23T16:29:36.900 回答
3

首先,aString不是a 。A使用a ,但仅此而已。char[]String char[]

您的建议是对特殊字符的自定义解释,以标记字符数组的“使用范围”,如果这是您为方法创建的合同,这很好。

在 java 中,所有字符都是“有效”字符,但是官方保证永远不会使用 unicode“非字符”对字符进行编码:\uFDD0通过\uFDEF, \uFFFE\uFFFF.

您可以考虑使用其中之一作为“范围结束”标记字符。

于 2013-07-23T16:43:51.683 回答