2010-03-15 15 views

cevap

18

Apaçi en ArrayUtils bu vardır (hala behind the scenes dolaşır):

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

Hep böyle şeyler için kontrol etmek için iyi bir yerdir.

+2

Otomatik +1. – skaffman

+0

@skaffman Apache Commons Lang'i tavsiye ederim ... bu özel problem için değil ... ama yine de, hareketinizi yapın;) – sfussenegger

+0

Aslında, sahnelerin arkasında yinelenmiyor - iki kez yineleniyor. Bir koleksiyondan ilkel bir dizi oluşturma sürecini yavaşlatan gereksiz bir "Tamsayı" var. Aslına bakarsanız, 'İntegre [] '' Iterable ' yerine ''Örnek (..)' parametresi olarak' Tamsayı [] 'seçeneğini kullanmanın seçimini 'Arrays.asList (Tamsayı [])' gibi biraz daha karmaşık hale getirme seçeneğidir. 'collection.toArray() '. Bu nedenle apache commons'ı önermek için otomatik olarak + 1'lemem. :) – sfussenegger

2

Nope gibi döküm deneyin bile, Nesne [] dizi kabul etmeyecektir

void doSomething(int[] arr) 

için dizisi geçirmek istiyorum; Onları tekrarlamak zorundasın. Afedersiniz.

+0

Eğer düşünürseniz anlamlıdır. ints nesneler değildir, bu yüzden birini diğerine yazmanız işe yaramıyor. –

+1

Bir KarmaSet of Integers'dan bir dizi ints alamıyor olsanız da, autoboxing'in devreye girip bunu yapmasına izin vermemesi garip görünüyor. HashSet'in bir tür karışımı içerdiği gibi değil, hepsi Integers (yani görebildiğim kadarıyla), bir problem olmaz. – jackbot

+2

Koleksiyonlar yalnızca nesneleri taşıyabilir (durumunuzdaki tamsayılar). Dolayısıyla, bir dizi dizinin elde edilmesi için özel bir yönteme sahip olmak tuhaf olurdu (diğer ilkel tipler için karşılık gelen yöntemler gerekli olacaktır). Otomatik kutulama yardımcı olmaz, çünkü yalnızca tek bir ilkel <-> nesne dönüşümü için geçerlidir. Unutmayın ki gerçek sınıfa (tip silme nedeniyle) HashSet, HashSet değil (sadece bir derleme zamanı kavramı). –

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

Sizin için kodu yazdığıma göre, artık bu el kitabı değil, değil mi? ;)

+3

Bunu elle yazmak için kod yazmak sorun değildi, daha iyi olup olmadığını merak ettim. Bunu yapmanın yolu. – jackbot

+0

Evet, cevabımın özü, bu kodu yazmanın önüne geçmenin tek yolunun başkalarının yazmasını sağlamaktı (ancak aslında herhangi bir kod için geçerli olan budur) - başarılı bir şekilde yaptınız;) – sfussenegger

+0

mu? Eğer öyleyse, bu kod NPE olacaktır. Orijinal posterin null'larla ne yapmak istediğinden emin değilim. Sanırım ortaya çıkan diziden onları çıkartacağım. – davidsheldon

-4

Ayrıca ToArray (T [] içindekiler) toArray() yönteminin varyantı kullanabilir. HashSet aynı boyutta ints boş bir dizi oluşturun ve sonra toArray() yöntemine geçmek:

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

yerine int[] bir Integer[] dizi kabul etmek doSomething() fonksiyonunu değiştirmek gerekir. Bu mümkün değilse, toArray tarafından döndürülen değer dizisini int[]'a dönüştürdünüz.

+1

Hayır, derleme yapmaz. – jkff

+0

Derleme hatalarınızı sağlamanıza yardımcı olur, böylece kodumda neyin yanlış olduğunu anlatabilirim. – Shiprack

+2

Neden kendin derlemeyi denemiyorsun? Derleme hatasını gördüğünüzde, bunun neden olduğunu açıklayabilirim. – jkff

3

Hatta Apache Utils olmadan Set<Integer>Integer[] için dönüştürebilirsiniz:

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

Ancak, kümesini yinelemenize zorunda int[] gerekirse.

4

sadece Guava en kullanabilirsiniz:

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

herhangi Collection<Integer> bir int[] oluşturabilir Java 8 akışları kullanılarak (a dahil): kütüphane hala koleksiyonu üzerinde yineleme olduğu

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

(veya başka bir akış kaynağı) sizin adınıza, elbette.

özlü olma ve hiçbir harici kütüphane bağımlılıkları sahip olmanın yanı sıra, aynı zamanda kopyalamak gerçekten büyük bir koleksiyona varsa paralel gitmesine izin akışlarını.

+0

Biraz daha özlü: int [] array = coll.stream() mapToInt (x -> x) .toArray() – HammerNL

İlgili konular