未完全填充的字符数组中的字符串

时间:2012-10-05 12:20:05

标签: java string arrays

显然,以下代码给出了一个相当奇怪的结果。

char[] data = new char[5];
data[0] = 'a';
data[1] = 'b';
data[2] = 'c';

out.println("'" + new String(data) + "'");
  

'ABC□□'

有没有办法从字符数组创建一个字符串,考虑到整个数组可能没有用字符填充到最后?


问题原因:当使用Reader.read(char[])方法时,你会给它一个字符数组来填充,我只能假设它不会被完全填充,除非你很幸运,当你到达流的末尾。所以想知道如何把它变成一个你可以附加到StringBuffer的字符串。现在实现虽然read方法实际上返回了读取的字节数,我假设它可以与StringBuffer.append(char[], int, int)结合使用,这使我的问题没有实际意义。但是,仍然是我很好奇的东西,而不是我通过谷歌搜索找到的东西,所以我想这个问题在这里得到答案是好的;)

3 个答案:

答案 0 :(得分:1)

String有构造函数String(char[] value, int offset, int count),它接受​​char加上长度(和偏移量)的数组:

String s = new String(data, 0, 3);

假设在data中没有嵌入的空字符(前导空字符被认为是嵌入的空字符),解决方案需要找到第一个空字符以确定char的数量{ {1}}:

data

答案 1 :(得分:1)

我想不出一个不起作用的强大方法:

char[] data = new char[5];
data[0] = 'a';
data[1] = 'b';
data[2] = 'c';

StringBuilder builder = new StringBuilder();
for (char c : data) {
  if (c != 0x00) {
    builder.append(c);
  }
}

System.out.println(builder.toString());

这特别省略了值等于默认值(0x00)的字符。请注意,这远非完美,因为0x00是一个合法的字符。我建议你重新评估引导你到达这一点的设计决策。

我不是那些假设((char) 0x00)是空白并且可以修剪的解决方案的粉丝。即使它有效。请注意:

System.out.println(' ' == ((char) 0x00));

将打印false

答案 2 :(得分:0)

是的,使用带有偏移量和长度的字符串constructor

 String(char[] value, int offset, int count) 

 new String(data,0,3) 

现在,如果未知确切值,则可以编写实用程序方法来更正数组。或使用trim()修剪尾随字符。

 public static char[] getNotMessedUpArray(char[] messedUp) {

    int messedUpIndex = messedUp.length;
    for (int i = 0; i < messedUp.length; i++) {
        if (messedUp[i] <= ' ') {
            System.arraycopy(messedUp, i + 1, messedUp, i, messedUp.length
                    - i - 1);
        }
    }
    for (int i = 0; i < messedUp.length; i++) {
        if (messedUp[i] <= ' ') {
            messedUpIndex--;
        }
    }
    char[] notMessedUp = new char[messedUpIndex];
    System.arraycopy(messedUp, 0, notMessedUp, 0, messedUpIndex);
    return notMessedUp;

}