2012-10-05 102 views
3

下面的代碼顯然給出了一個相當奇怪的結果。字符串未填滿字符數組

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)組合使用,這使我的問題沒有意義。但是,仍然是我很好奇,這也不是我設法通過Google找到,所以我想這個問題是好事,這裏的答案;)

+0

解決方案是否必須處理嵌入的空字符,如果是,應該採取什麼行爲? – hmjd

+0

如果通過嵌入你的意思是與其他字符混合在一起,那麼沒有。 – Svish

+2

這裏真正的問題是空字符是如何到達那裏的?你是否忽略了更多的讀取結果? – EJP

回答

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); 
+1

假設OP提前知道哪些字符丟失。 –

+0

@DuncanJones,是的。 – hmjd

+0

這不工作的失蹤字符不在邊緣。 – Baz

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; 

} 
+1

然後,你必須確切知道已經設置了多少。 – Svish

+0

然後,你將不得不遍歷字符串,並檢查每個字符是「<=''//空間字符'並創建新的字符串。 –

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

+0

「0x00」與「0」不同嗎? – Svish

+0

不是我的習慣。 –

+0

@DuncanJones - 應該指出的是,OP已經澄清了他的問題,以明確1)無效字符總是在末尾,並且2)他知道最後一個有效字符的位置。 –