我有一个里面HashSet<Integer>
有一堆Integers
。我想把它变成一个数组,但是调用
hashset.toArray();
返回一个Object[]
. int
除了手动遍历每个元素之外,还有更好的方法将其转换为数组吗?我想将数组传递给
void doSomething(int[] arr)
它不会接受 Object[] 数组,即使我尝试将它转换为
doSomething((int[]) hashSet.toArray());
您可以使用 Java 8 流int[]
从任何Collection<Integer>
(包括 a )创建一个:HashSet<Integer>
int[] array = coll.stream().mapToInt(Number::intValue).toArray();
当然,该库仍在代表您对集合(或其他流源)进行迭代。
除了简洁并且没有外部库依赖之外,如果你有一个非常大的集合要复制,流还可以让你并行。
Apache 的ArrayUtils有这个(它仍然在幕后迭代):
doSomething(ArrayUtils.toPrimitive(hashset.toArray()));
他们总是检查此类事情的好地方。
即使没有 Apache Utils ,您也可以将 a 转换为Set<Integer>
:Integer[]
Set<Integer> myset = new HashSet<Integer>();
Integer[] array = myset.toArray(new Integer[0]);
但是,如果您需要,int[]
您必须遍历该集合。
public int[] toInt(Set<Integer> set) {
int[] a = new int[set.size()];
int i = 0;
for (Integer val : set) a[i++] = val;
return a;
}
现在我为您编写了代码,它不再是那个手册了,是吗?;)
你可以只使用番石榴的:
Ints.toArray(Collection<? extends Number> collection)
试试这个。使用 Java 8。
Set<Integer> set = new HashSet<>();
set.add(43);
set.add(423);
set.add(11);
set.add(44);
set.add(56);
set.add(422);
set.add(34);
int[] arr = set.stream().mapToInt(Integer::intValue).toArray();
没有; 你必须遍历它们。对不起。
您还可以使用 toArray() 方法的 toArray(T[] contents) 变体。创建一个与 HashSet 大小相同的空整数数组,然后将其传递给 toArray() 方法:
Integer[] myarray = new Integer[hashset.size()];
doSomething(hashset.toArray(myarray));
您必须更改doSomething()
函数以接受Integer[]
数组而不是int[]
. 如果这不可行,您可以将返回的值数组转换toArray
为int[]
.