40

我有一个里面HashSet<Integer>有一堆Integers。我想把它变成一个数组,但是调用

hashset.toArray();

返回一个Object[]. int除了手动遍历每个元素之外,还有更好的方法将其转换为数组吗?我想将数组传递给

void doSomething(int[] arr)

它不会接受 Object[] 数组,即使我尝试将它转换为

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

8 回答 8

34

您可以使用 Java 8 流int[]从任何Collection<Integer>(包括 a )创建一个:HashSet<Integer>

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

当然,该库仍在代表您对集合(或其他流源)进行迭代。

除了简洁并且没有外部库依赖之外,如果你有一个非常大的集合要复制,流还可以让你并行。

于 2016-03-20T02:23:38.733 回答
22

Apache 的ArrayUtils有这个(它仍然在幕后迭代):

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

他们总是检查此类事情的好地方。

于 2010-03-15T23:36:25.253 回答
7

即使没有 Apache Utils ,您也可以将 a 转换为Set<Integer>Integer[]

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

但是,如果您需要,int[]您必须遍历该集合。

于 2013-02-25T14:12:23.450 回答
6
public int[] toInt(Set<Integer> set) {
  int[] a = new int[set.size()];
  int i = 0;
  for (Integer val : set) a[i++] = val;
  return a;
}

现在我为您编写了代码,它不再是那个手册了,是吗?;)

于 2010-03-15T23:33:58.553 回答
4

你可以只使用番石榴的:

Ints.toArray(Collection<? extends Number> collection)
于 2014-04-11T21:28:36.040 回答
4

试试这个。使用 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();
于 2019-07-22T10:20:33.160 回答
2

没有; 你必须遍历它们。对不起。

于 2010-03-15T23:29:40.650 回答
-4

您还可以使用 toArray() 方法的 toArray(T[] contents) 变体。创建一个与 HashSet 大小相同的空整数数组,然后将其传递给 toArray() 方法:

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

您必须更改doSomething()函数以接受Integer[]数组而不是int[]. 如果这不可行,您可以将返回的值数组转换toArrayint[].

于 2012-04-17T21:54:20.037 回答