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)ください。これは、 と組み合わせて使用​​できると思います。しかし、それでも私が興味を持っているものであり、グーグルで見つけたものではないので、この質問はここで答えを得るのに良いと思います;)

4

3 に答える 3

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());

これにより、デフォルト ( ) と等しい値を持つ文字が明確に省略されます0x000x00正当な char であるため、これは完全にはほど遠いことに注意してください。この時点に至るまでの設計上の決定を再評価することをお勧めします。

私は、((char) 0x00)空白であり、トリミングできると想定するソリューションのファンではありません。たとえそれが機能しても。ご了承ください:

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

印刷されますfalse

于 2012-10-05T12:29:11.447 に答える
1

Stringhas コンストラクターString(char[] value, int offset, int count)charは、プラスの長さ (およびオフセット)の配列を受け入れます。

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

ソリューションに埋め込まれた null 文字 (先頭の null 文字が埋め込まれた null と見なされる場合) がないと仮定するとdata、最初の null 文字を見つけてcharinの数を決定する必要がありdataます。

int length = 0;
while (length < data.length && 0 != data[length]) length++;
String s = new String(data, 0, length);
于 2012-10-05T12:22:11.007 に答える
0

はい、オフセットと長さを持つ文字列コンストラクターを使用しています。

 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;

}
于 2012-10-05T12:23:06.827 に答える