web-dev-qa-db-ja.com

メソッドtoArrayが指定されていない場合、toArray()を使用してハッシュセットを配列に変換する方法は?

Java API for Javaコレクションフレームワーク、HashSetにtoArray()メソッドが見つかりませんでした。抽象クラスSetにtoArray()メソッドがあります。

class Ideone {
    public static void main (String[] args) throws Java.lang.Exception {
        Set x = new HashSet();
        x.add(4);
        //ArrayList<Integer> y = x.toArray(); this does not work !
        int[] y = x.toArray();//this does not work!

        System.out.println(x.toArray());//this gives some weird stuff printed : Ljava.lang.Object;@106d69c
    }
}

ToArray()が指定されていない場合、ハッシュセットを配列に変換するにはどうすればよいですか?

16
ERJAN

もちろん、HashSettoArrayを実装します。このメソッドを指定するSetインターフェイスを実装するため、これを実装する必要があります。実際の実装は、AbstractCollectionのスーパークラスであるAbstractSetのスーパークラスであるHashSetにあります。

まず、生の型を使用しないでください。

つかいます :

_Set<Integer> x = new HashSet<>();
x.add(4);
_

次に、配列に変換します。

_Integer[] arr = x.toArray(new Integer[x.size()]);
_

x.toArray()を使用すると、_Object[]_が得られます。

32
Eran

HashSetのジェネリックを必ず宣言してください

Set<Integer> x = new HashSet<>();

そして、それを次のような配列に変換します。

int[] y = new int[x.size()];
int c = 0;
for(int x : x) y[c++] = x;
4
SamTebbs33

最初の行

ArrayList y = x.toArray();これは動作しません !

まず、Set x = new HashSet();すなわちrawタイプを使用しました。コンパイラは、整数オブジェクトを含むことを知りませんが、左側の上の行では、実際には配列である整数の配列リストになると言っています

2行目

int [] y = x.toArray(); //これは機能しません!

左側の上の行では、実際にはオブジェクトの配列である整数の配列になると言っています

これは動作します

Object[] y = x.toArray();

しかし、これは正しい方法ではありません。生のタイプは使用しないでください

 Set<Integer> x = new HashSet<>();
 Integer[] intArray= x.toArray(new Integer[x.size()]);

System.out.println(x.toArray()); //これにより、奇妙なものが印刷されます:Ljava.lang.Object; @ 106d69c

その印刷 toString 配列オブジェクトの表現。だから、あなたはそれをLjava.lang.Object;@106d69c

各要素を印刷する場合は、要素を繰り返し処理してから印刷します。

2
M Sach

もともと単純な配列ではなくArrayListを作成したかったようです。だから、これを試してみてください!

class Ideone 
{
        public static void main (String[] args) throws Java.lang.Exception   
        {
            Set x = new HashSet();
            x.add(4);
            ArrayList<Integer> y = ArrayList<Integer>(x);
            System.out.println(y);
        }
}
2
paiego

ループを反復処理して、値を配列に格納できます。

int[] answer = new int[set1.size()];
int i = 0;
for (int num : set1) {
      answer[i++] = num;
}
0
user3133925

TreeSetArrayListおよびArrayを使用して小さなマップをソートするJDK 7の比較:

long start  = System.currentTimeMillis(); 
for(int i=0; i<10000000; i++){ 
   TreeSet a   = new TreeSet(payloads.keySet());                           
} 
System.out.println("TreeSet: "    + (System.currentTimeMillis()-start) + " ms.");
start       = System.currentTimeMillis(); 
for(int i=0; i<10000000; i++){ 
   ArrayList a = new ArrayList(payloads.keySet()); 
   Collections.sort(a);    
} 
System.out.println("ArrayList: "  + (System.currentTimeMillis()-start) + " ms.");
start       = System.currentTimeMillis(); 
for(int i=0; i<10000000; i++){ 
   String[] a = payloads.keySet().toArray(new String[payloads.size()]); 
   Arrays.sort(a);    
} 
System.out.println("Array: "  + (System.currentTimeMillis()-start) + " ms.");

利回り:

ツリーセット:1527ミリ秒。
ArrayList:943ミリ秒。
配列:485ミリ秒。

0
sjzack