2010-03-15 48 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

相关问题