2010-03-15 7 views
20

Ich habe eine mit einer Reihe von Integers drin. Ich möchte es in ein Array drehen, aberWie kann ich ein Java HashSet <Integer> in ein primitives int-Array konvertieren?

hashset.toArray(); 

gibt ein Object[] Aufruf. Gibt es eine bessere Möglichkeit, es in ein Array von int anders als durch jedes Element manuell durchlaufen zu werfen? Ich möchte das Array

void doSomething(int[] arr) 

, die das Object [] Array akzeptieren wird nicht passieren, auch wenn ich versuche, es wie

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

Antwort

18

Apache ArrayUtils der hat dies (es iteriert noch behind the scenes):

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

Sie sind immer ein guter Ort für Dinge wie diese zu überprüfen.

+2

Automatische +1 für die Empfehlung von Apache Commons. – skaffman

+0

@skaffman Ich würde Apache Commons Lang empfehlen ... aber nicht für dieses spezielle Problem ... aber trotzdem, mach deinen Zug;) – sfussenegger

+0

Eigentlich iteriert es nicht hinter den Kulissen - es iteriert zweimal. Es gibt eine unnötige 'Ganzzahl []', die den Prozess der Erstellung eines primitiven Arrays aus einer Sammlung verlangsamt. Tatsächlich denke ich, dass die Wahl, 'Integer []' als Parameter für 'toPrimitive (..)' anstelle von 'Iterable ' zu verwenden, ein wenig klobig ist, da 'Arrays.asList (Integer [])' eine viel schnellere Operation ist 'collection.toArray()'. Daher werde ich nicht automatisch +1 für Apache Commons empfehlen :) – sfussenegger

2

Nope Gießen; Sie müssen über sie iterieren. Es tut uns leid.

+0

Es macht Sinn, wenn Sie darüber nachdenken. Ints sind keine Objekte, also funktioniert die Typumwandlung nicht. –

+1

Es scheint seltsam, dass Sie nicht ein Array von Ints von einem HashSet of Integers erhalten können, sollte das Autoboxing nicht dazu führen, dass Sie es tun können? Es ist nicht so, dass das HashSet eine Mischung von Typen enthält, sie sind alle Ganzzahlen (so weit ich das sehen kann), es wäre kein Problem. – jackbot

+2

Sammlungen können nur Objekte enthalten (in Ihrem Fall Ganzzahlen). Daher wäre es seltsam, eine spezielle Methode zu haben, um ein Array von Ints zu erhalten (entsprechende Methoden wären für andere primitive Typen erforderlich). Auto-Boxing hilft nicht, da dies nur für eine einzelne primitive <-> Objektkonvertierung gilt. Denken Sie daran, dass die tatsächliche Klasse (aufgrund des Löschvorgangs) HashSet ist, nicht HashSet (nur ein Kompilierzeitkonzept). –

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

Nun, da ich den Code für Sie geschrieben habe, ist es nicht mehr dieses Handbuch, oder? ;)

+3

Es war nicht so, dass das Schreiben des Codes, um es manuell zu tun, ein Problem war, ich war nur neugierig zu sehen, ob es ein besseres gab Weg, es zu tun. – jackbot

+0

Nun, die Essenz meiner Antwort war, dass die einzige Möglichkeit, diesen Code zu schreiben, andere dazu bringt, sie zu schreiben (aber eigentlich ist das bei fast jedem Code der Fall) - was Sie erfolgreich getan haben;) – sfussenegger

+0

Können Sie null in a setzen Set ? Wenn ja, wird dieser Code NPE. Ich bin nicht sicher, was das ursprüngliche Plakat mit Nullen tun würde, obwohl. Vermutlich lasse ich sie aus dem resultierenden Array weg. – davidsheldon

-4

Sie können auch die toArray (T [] contents) Variante der toArray() Methode verwenden. Erstellen Sie ein leeres Array von ints der gleichen Größe wie die HashSet, und es dann passieren, um die toArray() Methode:

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

Sie müßten die doSomething() Funktion ändern, um eine Integer[] Array statt int[] zu akzeptieren. Wenn das nicht machbar ist, müssten Sie das von toArray zurückgegebene Array von Werten in int[] konvertieren.

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

Wenn Sie jedoch int[] müssen Sie über den Satz wiederholen müssen:

+1

Nein, wird nicht kompiliert. – jkff

+0

Es würde helfen, Ihre Kompilierungsfehler zu liefern, damit ich sagen kann, was mit meinem Code nicht stimmt. – Shiprack

+2

Warum versuchst du es nicht einfach selbst zu kompilieren? Sobald Sie den Kompilierungsfehler sehen, kann ich Ihnen erklären, warum es passiert ist. – jkff

3

Sie können eine Set<Integer>-Integer[] auch ohne Apache Utils konvertieren.

4

Sie können mit nur Guava ist:

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

Sie können eine int[] von jedem Collection<Integer> erstellen (einschließlich eines) unter Verwendung von Java 8 Streams:

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

Die Bibliothek noch über die Sammlung iterieren (oder eine andere Quelle) natürlich in Ihrem Namen.

Zusätzlich zur Übersichtlichkeit und ohne externe Bibliotheksabhängigkeiten können Sie Streams auch parallel ausführen, wenn Sie eine wirklich große Sammlung zu kopieren haben.

+0

Etwas konziser: int [] array = coll.stream(). MapToInt (x -> x) .toArray() – HammerNL

Verwandte Themen