我有一個與其中一堆Integers
。我想把它變成一個數組,但是打電話給如何將Java HashSet <Integer>轉換爲基本int數組?
hashset.toArray();
返回一個Object[]
。除了手動迭代每個元素之外,是否有更好的方法將其轉換爲int
的數組?我想通過數組
void doSomething(int[] arr)
,不會接受對象[]數組,即使我嘗試鑄像
doSomething((int[]) hashSet.toArray());
我有一個與其中一堆Integers
。我想把它變成一個數組,但是打電話給如何將Java HashSet <Integer>轉換爲基本int數組?
hashset.toArray();
返回一個Object[]
。除了手動迭代每個元素之外,是否有更好的方法將其轉換爲int
的數組?我想通過數組
void doSomething(int[] arr)
,不會接受對象[]數組,即使我嘗試鑄像
doSomething((int[]) hashSet.toArray());
Apache的ArrayUtils有這個(它仍然遍歷behind the scenes):
doSomething(ArrayUtils.toPrimitive(hashset.toArray()));
他們總是檢查這樣的事情的好地方。
都能跟得上;你必須迭代它們。抱歉。
如果你仔細想想,這是有道理的。整數不是對象,因此將一個類型轉換爲另一個不起作用。 – 2010-03-15 23:35:12
看起來很奇怪,你不能從一個整數HashSet獲得一個整數數組,但是不應該讓自動裝箱踢入並允許你這麼做嗎?它不像HashSet包含混合類型,它們都是整數(所以我可以看到),它不會是一個問題。 – jackbot 2010-03-15 23:46:48
集合只能容納對象(整數在你的情況下)。因此,有一個特殊的方法來獲取一個int數組是很奇怪的(其他基本類型需要相應的方法)。自動裝箱功能沒有幫助,因爲這隻適用於單個原始對象轉換。請記住,實際的類(由於類型擦除)是HashSet,而不是HashSet
public int[] toInt(Set<Integer> set) {
int[] a = new int[set.size()];
int i = 0;
for (Integer val : set) a[i++] = val;
return a;
}
既然我爲你寫了代碼,那不是那個手冊了嗎? ;)
這並不是說手動編寫代碼是一個問題,我只是好奇,看看是否有更好的方法來做到這一點。 – jackbot 2010-03-15 23:44:45
那麼,我的答案的本質是,避免編寫此代碼的唯一方法是讓其他人編寫它(但實際上對於任何代碼都是如此) - 您已成功執行此操作;) – sfussenegger 2010-03-15 23:48:50
您可以將null設置
您也可以使用toArray()方法的toArray(T [] contents)變體。創建一個同樣大小的一個HashSet的int空數組,然後將它傳遞給指定者()方法:
Integer[] myarray = new Integer[hashset.size()];
doSomething(hashset.toArray(myarray));
你不得不改變doSomething()
函數接受一個Integer[]
數組,而不是int[]
。如果這樣做不可行,則需要將由toArray
返回的值數組轉換爲int[]
。
你可以轉換一個Set<Integer>
到Integer[]
即使沒有阿帕奇utils的:
Set<Integer> myset = new HashSet<Integer>();
Integer[] array = myset.toArray(new Integer[0]);
但是,如果你需要int[]
你必須遍歷集合。
你可以用番石榴的:
Ints.toArray(Collection<? extends Number> collection)
您可以從任何Collection<Integer>
創建int[]
使用Java 8流(包括):
int[] array = coll.stream().mapToInt(Number::intValue).toArray();
庫仍遍歷集合(或其他流源),當然。
除了簡潔並且沒有外部庫依賴關係之外,如果您有一個非常大的集合要複製,流也可以讓您並行執行。
稍微簡潔一點:int [] array = coll.stream()。mapToInt(x - > x).toArray() – HammerNL 2017-09-21 09:26:01
自動推薦Apache Commons的+1。 – skaffman 2010-03-15 23:41:48
@skaffman我推薦Apache Commons Lang ...雖然不是這個特殊的問題,但是無論如何,讓你的移動;) – sfussenegger 2010-03-15 23:51:24
實際上,它不會在後臺迭代 - 它迭代兩次。有一個不必要的'Integer []'減慢了從集合創建基本數組的過程。實際上,我認爲使用'Integer []'作爲'toPrimitive(..)'而不是'Iterable'的參數的選擇有點笨重,因爲'Arrays.asList(Integer [])'是一個比'collection.toArray()'。因此,我不會自動+1爲推薦Apache公共版:) –
sfussenegger
2010-03-16 00:06:33