我有一个与其中一堆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