2009-06-14 15 views
32

SunのJava Tutorialから、このコードがセットを配列に変換すると思ったでしょう。Java:文字列表現のためにセットを配列に変換する

import java.util.*; 

public class Blagh { 
    public static void main(String[] args) { 
     Set<String> set = new HashSet<String>(); 
     set.add("a"); 
     set.add("b"); 
     set.add("c"); 
     String[] array = set.toArray(new String[0]); 
     System.out.println(set); 
     System.out.println(array); 
    } 
} 

しかし、これは私が誤解している何

[a, c, b] 
[Ljava.lang.String;@9b49e6 

を与えますか?

+2

"[Ljava.lang.String; @ 9b49e6"は文字列の配列です。 – Fredrik

+0

これで要素の順序が正確でしたか?私は、注文が独自の考え方を持ち、項目が追加された順序ではないような状況に似ています。 – electrichead

+0

一般的にセットは定義されたオーダーを持っていないので、あなたがそれらを得る順序と同じセットに要素を入れる順序に依存することはできません。 SetインタフェースのLinkedHashSet実装を試してみてください。この保証が追加されます。 – Frans

答えて

32

コードは正常に動作します。

置換:

System.out.println(array); 

で:

System.out.println(Arrays.toString(array)); 

出力:

 
[b, c, a] 
[b, c, a] 

アレイのString表現はによって得られた配列の "テキスト表現" を表示しObject.toString - 配列のクラス名とハッシュコードをa 16進文字列。

+0

Javaのいくつかの部分は少し不親切かもしれません。 – coobird

+1

それはアドレスではありませんが、Object.hashCode()... – Joey

+0

いいですよ、それを修正します、ありがとう! – coobird

1

私はあなたが何か誤解しているとは思わない。コードが機能するはずです。ただし、配列はtoStringメソッドで内容を印刷するほどスマートではないため、

for(String s : array) println(s); 

などの内容を印刷する必要があります。

5

問題ありません。

println はobject.toString()を呼び出して出力用のオブジェクトからバイトを取得するため、System.out.println(配列)で配列の内容が表示されません。

HashSetはデフォルトのtoString()実装をオーバーライドするので、System.out.println(set)で設定内容を見ることができます。助け9b49e6

希望@;デフォルトのtoString()(つまり、クラス名とアイデンティティーハッシュコードのいくつかの並べ替えを与える)、あなたはファジー[Ljava.lang.Stringを得ているが上書きされることはありません配列として

9

完全性のチェックのためにもjava.util.Arrays.toStringおよびjava.util.Arrays.deepToStringです。

後者は、 ネストされた配列(Object [] []など)を扱うときに特に便利です。

+0

私は同意します。これらのメソッドはasList()を介して中間リストを作成するよりも効率的です。 deepToString()は、多次元配列や複雑なネストに最も便利です。 –

2

DFAは前述のように、あなただけ置き換えることができます。

System.out.println(array); 

System.out.println(Arrays.toString(array)); 
0

...とあなたは正しい結果を持っています。残念ながら、配列のtoString()メソッドは元のObject.toString()のままですので、出力はデフォルトごとにいくらか使用できませんが、それはすべての配列に適用されます。

関連する問題