2010-03-15 17 views
20

Ho un con un gruppo di Integers in esso. Voglio trasformarlo in un array, ma chiamandoCome posso convertire un Java HashSet <Integer> in un array primitivo int?

hashset.toArray(); 

restituisce un Object[]. C'è un modo migliore per lanciarlo su un array di int diverso dall'iterazione manuale di ogni elemento? Voglio passare la matrice per

void doSomething(int[] arr) 

che non accetterà l'array Object [], anche se cerco il cast come

doSomething((int[]) hashSet.toArray()); 

risposta

18

Apache di ArrayUtils ha questo (ancora itera behind the scenes):

doSomething(ArrayUtils.toPrimitive(hashset.toArray())); 

Sono sempre un buon posto per verificare la presenza di cose come questa.

+2

+1 automatico per raccomandare Apache Commons. – skaffman

+0

@skaffman Mi raccomando Apache Commons Lang ... non per questo particolare problema però ... ma comunque, fai la tua mossa;) – sfussenegger

+0

In realtà, non itera dietro le quinte - itera due volte. Esiste un 'Integer []' non necessario che rallenta il processo di creazione di una matrice primitiva da una raccolta. In realtà, penso che la scelta di usare 'Integer []' come parametro per 'toPrimitive (..)' invece di 'Iterable ' è un po 'goffo come 'Arrays.asList (Integer [])' è un'operazione molto più veloce di 'collection.toArray()'. Quindi non automaticamente +1 per raccomandare commons apache :) – sfussenegger

2

No; devi iterare su di loro. Scusate.

+0

Ha senso se ci pensate. gli inte non sono oggetti, quindi il typecasting non funziona. –

+1

Sembra strano che non sia possibile ottenere una serie di intagli da un HashSet di Integers, tuttavia, non dovrebbe il kickbox automatico e consentire di farlo? Non è come se l'HashSet contenga una combinazione di tipi, sono tutti interi così (per quanto posso vedere), non sarebbe un problema. – jackbot

+2

Le raccolte possono contenere solo oggetti (numeri interi nel tuo caso). Pertanto, sarebbe strano avere un metodo speciale per ottenere una matrice di interi (i metodi corrispondenti sarebbero necessari per altri tipi primitivi). Il box automatico non aiuta, perché ciò vale solo per una singola conversione primitiva <->. Tenere presente che la classe effettiva (a causa della cancellazione del tipo) è HashSet, non HashSet (solo un concetto in fase di compilazione). –

4
public int[] toInt(Set<Integer> set) { 
    int[] a = new int[set.size()]; 
    int i = 0; 
    for (Integer val : set) a[i++] = val; 
    return a; 
} 

Ora che ho scritto il codice per te non è più quel manuale, vero? ;)

+3

Non era che scrivere il codice per farlo manualmente era un problema, ero solo curioso di vedere se c'era un migliore modo di farlo. – jackbot

+0

Bene, l'essenza della mia risposta è stata che l'unico modo per evitare di scrivere questo codice è far sì che altri lo scrivano (ma in realtà è il caso praticamente per qualsiasi codice) - cosa che hai fatto con successo;) – sfussenegger

+0

Puoi inserire null in un Impostare ? Se è così, questo codice sarà NPE. Non sono sicuro di cosa voglia fare il poster originale con i null. Immagino di ometterli dalla matrice risultante. – davidsheldon

-4

È anche possibile utilizzare la variante toArray (T [] contents) del metodo toArray(). Creare un array vuoto di int della stessa dimensione del HashSet, e poi passarlo al metodo toArray():

Integer[] myarray = new Integer[hashset.size()]; 
doSomething(hashset.toArray(myarray)); 

Dovreste modificare la funzione doSomething() ad accettare un Integer[] matrice anziché int[]. Se ciò non è possibile, è necessario convertire la matrice di valori restituiti da toArray a int[].

+1

No, non verrà compilato. – jkff

+0

Sarebbe utile fornire gli errori di compilazione in modo da poter capire cosa c'è di sbagliato nel mio codice. – Shiprack

+2

Perché non provi semplicemente a compilarlo da solo? Una volta visualizzato l'errore di compilazione, posso spiegarti perché è successo. – jkff

3

è possibile convertire un Set<Integer>-Integer[] anche senza Apache Utils:

Set<Integer> myset = new HashSet<Integer>(); 
Integer[] array = myset.toArray(new Integer[0]); 

Tuttavia, se avete bisogno di int[] si deve iterare il set.

4

Si può semplicemente utilizzare Guava di:

Ints.toArray(Collection<? extends Number> collection) 
8

è possibile creare un int[] da qualsiasi Collection<Integer> (tra cui un) utilizzando Java 8 flussi:

int[] array = coll.stream().mapToInt(Number::intValue).toArray(); 

La biblioteca è ancora scorrere il collezione (o altra fonte di flusso) a vostro nome, ovviamente.

Oltre ad essere conciso e privo di dipendenze di librerie esterne, gli stream consentono anche di andare in parallelo se si dispone di una raccolta veramente grande da copiare.

+0

Un po 'più conciso: int [] array = coll.stream(). MapToInt (x -> x) .toArray() – HammerNL

Problemi correlati