2012-10-05 2 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)과 함께 사용할 수 있다고 가정합니다.

+0

솔루션에서 포함 된 null 문자를 처리해야하는 경우가 있습니까? 그렇다면 문제는 무엇입니까? – hmjd

+0

임베디드를 사용하면 다른 문자와 섞인 것을 의미합니다. – Svish

+2

여기서 진짜 질문은 null 문자가 처음에는 어떻게 도착 했습니까? 당신은 더 이상 읽기 결과 수를 무시하고 있습니까? – EJP

답변

1

Stringchar를 더한 길이의 배열을 받아들이는 생성자 String(char[] value, int offset, int count)이있다)하지만, 여전히 뭔가 나는 약이 아니라 제가 인터넷 검색으로 찾아 관리하는 것이 궁금합니다, 그래서 나는이 질문은 여기에 대한 답을 가지고 좋은 생각 (오프셋) :

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

data에 (임베디드 널 (null)이 될 수있는 최고의 null 문자가 간주됩니다)에는 포함 null 문자를 가정하지 않는 솔루션에 char의 수를 결정하는 최초의 널 (null) 문자를 찾을 필요 data :

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가 있습니다.

정확한 값을 알 수없는 경우 유틸리티 방법을 사용하여 배열을 수정할 수 있습니다. 또는 후행 문자를 자르려면 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이기 때문에 이것은 완벽하지 않습니다. 나는 당신이이 시점으로 인도하는 설계 결정을 재평가 할 것을 제안합니다.

저는 ((char) 0x00)이 공백이며 트림 될 수 있다고 가정하는 솔루션의 팬이 아닙니다. 그것이 작동하더라도. 참고 :

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

false입니다.

+0

'0x00'은'0'과 다른가요? – Svish

+0

아니. 그냥 내 버릇이야. –

+0

@DuncanJones - OP는 1) 유효하지 않은 문자가 항상 끝에 있고, 2) 마지막으로 유효한 문자의 위치를 ​​알고 있음을 OP가 분명히 밝혀 둡니다. –

관련 문제