如何将Java HashSet <Integer>转换为原始int数组?

jac*_*bot 29 java arrays int hashset

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

hashset.toArray();
Run Code Online (Sandbox Code Playgroud)

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

void doSomething(int[] arr)
Run Code Online (Sandbox Code Playgroud)

它不会接受Object []数组,即使我尝试像它一样

doSomething((int[]) hashSet.toArray());
Run Code Online (Sandbox Code Playgroud)

Mat*_*hen 21

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

doSomething(ArrayUtils.toPrimitive(hashset.toArray()));
Run Code Online (Sandbox Code Playgroud)

他们总是一个检查这样的事情的好地方.

  • 自动+1用于推荐Apache Commons. (2认同)
  • @sfussenegger 实际上,答案中编写的代码会生成一个“Object[]”,所以它甚至不起作用。您将需要“ArrayUtils.toPrimitive(hashset.toArray(new Integer[0]))”,以使其成为应有的低效解决方案。 (2认同)

Jef*_*oom 20

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

int[] array = coll.stream().mapToInt(Number::intValue).toArray();
Run Code Online (Sandbox Code Playgroud)

当然,库仍在代表您迭代集合(或其他流源).

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

  • 更简洁一点: int[] array = coll.stream().mapToInt(x -&gt; x).toArray() (5认同)

小智 9

尝试这个。使用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();
Run Code Online (Sandbox Code Playgroud)


sfu*_*ger 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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 并不是手动编写代码是一个问题,我只是想知道是否有更好的方法来做到这一点. (4认同)

Tom*_*art 5

您可以将转换Set<Integer>Integer[]没有Apache Utils的情况:

Set<Integer> myset = new HashSet<Integer>();
Integer[] array = myset.toArray(new Integer[0]);
Run Code Online (Sandbox Code Playgroud)

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