2010-03-15 106 views
20

我有一個與其中一堆Integers。我想把它變成一個數組,但是打電話給如何將Java HashSet <Integer>轉換爲基本int數組?

hashset.toArray(); 

返回一個Object[]。除了手動迭代每個元素之外,是否有更好的方法將其轉換爲int的數組?我想通過數組

void doSomething(int[] arr) 

,不會接受對象[]數組,即使我嘗試鑄像

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

回答

18

Apache的ArrayUtils有這個(它仍然遍歷behind the scenes):

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

他們總是檢查這樣的事情的好地方。

+2

自動推薦Apache Commons的+1。 – skaffman 2010-03-15 23:41:48

+0

@skaffman我推薦Apache Commons Lang ...雖然不是這個特殊的問題,但是無論如何,讓你的移動;) – sfussenegger 2010-03-15 23:51:24

+0

實際上,它不會在後臺迭代 - 它迭代兩次。有一個不必要的'Integer []'減慢了從集合創建基本數組的過程。實際上,我認爲使用'Integer []'作爲'toPrimitive(..)'而不是'Iterable '的參數的選擇有點笨重,因爲'Arrays.asList(Integer [])'是一個比'collection.toArray()'。因此,我不會自動+1爲推薦Apache公共版:) – sfussenegger 2010-03-16 00:06:33

2

都能跟得上;你必須迭代它們。抱歉。

+0

如果你仔細想想,這是有道理的。整數不是對象,因此將一個類型轉換爲另一個不起作用。 – 2010-03-15 23:35:12

+1

看起來很奇怪,你不能從一個整數HashSet獲得一個整數數組,但是不應該讓自動裝箱踢入並允許你這麼做嗎?它不像HashSet包含混合類型,它們都是整數(所以我可以看到),它不會是一個問題。 – jackbot 2010-03-15 23:46:48

+2

集合只能容納對象(整數在你的情況下)。因此,有一個特殊的方法來獲取一個int數組是很奇怪的(其他基本類型需要相應的方法)。自動裝箱功能沒有幫助,因爲這隻適用於單個原始對象轉換。請記住,實際的類(由於類型擦除)是HashSet,而不是HashSet (僅適用於編譯時概念)。 – 2010-03-16 00:13:16

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

既然我爲你寫了代碼,那不是那個手冊了嗎? ;)

+3

這並不是說手動編寫代碼是一個問題,我只是好奇,看看是否有更好的方法來做到這一點。 – jackbot 2010-03-15 23:44:45

+0

那麼,我的答案的本質是,避免編寫此代碼的唯一方法是讓其他人編寫它(但實際上對於任何代碼都是如此) - 您已成功執行此操作;) – sfussenegger 2010-03-15 23:48:50

+0

您可以將null設置?如果是這樣,這個代碼將NPE。我不確定原始海報會如何處理空值。我想從結果數組中省略它們。 – davidsheldon 2010-10-14 06:53:21

-4

您也可以使用toArray()方法的toArray(T [] contents)變體。創建一個同樣大小的一個HashSet的int空數組,然後將它傳遞給指定者()方法:

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

你不得不改變doSomething()函數接受一個Integer[]數組,而不是int[]。如果這樣做不可行,則需要將由toArray返回的值數組轉換爲int[]

+1

不,不會編譯。 – jkff 2012-08-07 02:38:05

+0

這將有助於提供編譯錯誤,以便我可以告訴我的代碼有什麼問題。 – Shiprack 2012-08-07 12:12:00

+2

你爲什麼不嘗試自己編譯它?一旦你看到編譯錯誤,我可以向你解釋爲什麼會發生。 – jkff 2012-08-07 19:49:33

3

你可以轉換一個Set<Integer>Integer[]即使沒有阿帕奇utils的:

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

但是,如果你需要int[]你必須遍歷集合。

4

你可以用番石榴的:

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

您可以從任何Collection<Integer>創建int[]使用Java 8流(包括):

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

庫仍遍歷集合(或其他流源),當然。

除了簡潔並且沒有外部庫依賴關係之外,如果您有一個非常大的集合要複製,流也可以讓您並行執行。

+0

稍微簡潔一點:int [] array = coll.stream()。mapToInt(x - > x).toArray() – HammerNL 2017-09-21 09:26:01