2015-11-08 16 views
6

Guardando java api per il framework java collections, non ho trovato il metodo toArray() in HashSet, c'è il metodo toArray() nella classe astratta Set.Come convertire hash Impostare in array usando toArray() se il metodo toArray non è specificato?

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 
    } 
} 

Come si converte hashset in array se non è specificato toArray()?

+3

beh, il toArray restituisce un 'oggetto [] ', solo la stampa che ti dà il tipico output java se toString non viene sovrascritto correttamente. E un 'Object []' non è implicitamente convertibile in 'int []'. – luk2302

+0

@ luk2302 esattamente. Questo è ciò che ho scritto nella mia risposta, ma è stato downvoted. Non sono sicuro di quale sia il problema in risposta. Qualcuno può spiegare per favore in modo che io possa migliorare –

+0

@MSach probabilmente perché si spiega solo l'output stampato, non perché la prima riga non funziona né quale sarebbe il modo corretto - ma ovviamente è solo un'ipotesi – luk2302

risposta

19

Ovviamente HashSet strumenti toArray. Deve implementarlo, poiché implementa l'interfaccia Set, che specifica questo metodo. L'implementazione effettiva è in AbstractCollection che è la super classe di AbstractSet che è la super classe di HashSet.

Prima di tutto, non utilizzare i tipi non elaborati.

Usa:

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

poi convertire in array:

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

Utilizzando x.toArray() darebbe un Object[].

+0

sì, ho appena notato che è possibile aggiungere stringhe, int, char ecc. A hashSet non specificato! – ERJAN

+1

@ERJAN Sì, perché utilizza la classe 'Object', e le versioni in scatola di quelle primitive estendono' Object'. – SamTebbs33

2

Assicurarsi che si dichiara il generico per il HashSet

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

e convertirlo in un array in questo modo:

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

prima linea

ArrayList y = x.toArray(); questo non funziona !

Prima di tutto si utilizzava Set x = new HashSet(); il tipo grezzo. Compilatore non sa che s andando a contenere oggetto intero, ma con la linea in alto a sinistra si sta dicendo sua intenzione di essere arraylist di intero, dove in realtà la sua una serie

Seconda linea

int [] y = x.toArray(); // questo non funziona!

con la linea di cui sopra sul lato sinistro si stanno dicendo sua intenzione di essere array di interi in cui in realtà la sua un array di oggetti

Ciò funzionerà

Object[] y = x.toArray(); 

ma questo non è il modo giusto . Si consiglia di non utilizzare i tipi di prime

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

System.out.println (x.toArray()); // Questo dà un po 'di roba strana stampato : Ljava.lang.Oggetto; @ 106d69c

La sua stampa toString rappresentazione di oggetto matrice. Ecco perché lo vedete come Ljava.lang.Object;@106d69c

Se si desidera stampare ciascun elemento, scorrere su di esso e quindi stamparlo.

+0

Downvoter sarà utile sapere cosa c'è di sbagliato qui? Non sto ottenendo il problema nella risposta –

+0

ho svettato di nuovo per dare una risposta migliore – ERJAN

2

Sembra che in origine si intendesse creare un ArrayList piuttosto che un semplice array. Quindi, prova questo!

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); 
     } 
} 
+0

Tweak da leggere: new ArrayList – rothschild86

0

Confronto in JDK 7 ordinamento una piccola mappa, utilizzando TreeSet, ArrayList e Array:

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."); 

rendimenti:

TreeSet: 1527 ms.
ArrayList: 943 ms.
Matrice: 485 ms.