【问题标题】:String from not fully filled character array来自未完全填充的字符数组的字符串
【发布时间】:2012-10-05 12:20:04
【问题描述】:

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

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) 结合使用,这使得我的问题没有实际意义。但是,仍然是我很好奇的东西,而不是我通过谷歌搜索找到的东西,所以我想这个问题在这里得到答案是件好事;)

【问题讨论】:

  • 解决方案是否必须处理嵌入的空字符,如果是,行为应该是什么?
  • 如果嵌入你的意思是与其他字符混合,那么没有。
  • 这里真正的问题是空字符最初是如何到达那里的?您是否忽略了更远的读取结果计数?
  • @EJP 老实说,直到我发布这个问题之后,我才想到阅读结果,所以这个问题现在对于我的特殊情况来说有点实际,但仍然很好奇是否有任何聪明的解决方案何时你没有那个数:)
  • Reader.read(char[]) 返回读取了多少个字符。

标签: java string arrays


【解决方案1】:

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

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

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

int length = 0;
while (length < data.length && 0 != data[length]) length++;
String s = new String(data, 0, length);

【讨论】:

  • 假设 OP 事先知道缺少哪些字符。
  • @Baz,你说的 edge 是什么意思?
  • @hmjd 对不起,我的意思是 ab□c□ 例如。在这种情况下,您的方法不会消除第一个丢失的字符。
  • @Baz,在这种情况下String 应该是什么样子?是否应该清除丢失的char,用空格替换?这真的是一个要求吗?
  • @hmjd 不要问我,问 OP。 OP 刚刚说:“整个数组可能没有被填满”。
【解决方案2】:

我想不出一个不起作用的健壮方法如下:

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

【讨论】:

  • 0x000 不同吗?
  • @DuncanJones - 应该注意的是,OP已经澄清了他的问题,以明确1)无效字符总是在最后,2)他知道最后一个有效字符的位置.
【解决方案3】:

是的,使用带有偏移量和长度的字符串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;

}

【讨论】:

  • 那么你必须知道到底设置了多少。
  • 然后你必须遍历字符串并检查每个字符是否为&lt;= ' '//Space char 并创建新字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多