Как я могу преобразовать Java HashSet <Integer>в примитивный массив int? - PullRequest
24 голосов
/ 16 марта 2010

У меня есть HashSet<Integer> с кучей Integers в нем. Я хочу превратить его в массив, но вызов

hashset.toArray();

возвращает Object[]. Есть ли лучший способ привести его к массиву int, кроме итерации каждого элемента вручную? Я хочу передать массив в

void doSomething(int[] arr)

, который не примет массив Object [], даже если я попытаюсь привести его как

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

Ответы [ 7 ]

20 голосов
/ 16 марта 2010

Apache's ArrayUtils имеет это (он все еще повторяет за кадром ):

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

Они всегда являются хорошим местом для проверки подобных вещей.

17 голосов
/ 20 марта 2016

Вы можете создать int[] из любого Collection<Integer> (включая HashSet<Integer>), используя потоки Java 8:

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

Библиотека, конечно же, продолжает перебирать коллекцию (или другой источник потока) от вашего имени.

Помимо краткости и отсутствия внешних зависимостей от библиотек, потоки также позволяют вам идти параллельно, если у вас есть действительно большая коллекция для копирования.

5 голосов
/ 16 марта 2010
public int[] toInt(Set<Integer> set) {
  int[] a = new int[set.size()];
  int i = 0;
  for (Integer val : set) a[i++] = val;
  return a;
}

Теперь, когда я написал код для вас, это уже не то руководство, не так ли? ;)

4 голосов
/ 12 апреля 2014

Вы можете просто использовать Guava's:

Ints.toArray(Collection<? extends Number> collection)
4 голосов
/ 25 февраля 2013

Вы можете конвертировать Set<Integer> в Integer[] даже без использования Apache:

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

Однако, если вам нужно int[], вам придется перебирать набор.

2 голосов
/ 16 марта 2010

Нету; Вы должны перебирать их. К сожалению.

0 голосов
/ 18 апреля 2012

Вы также можете использовать вариант toArray (T [content)) метода toArray (). Создайте пустой массив целых чисел того же размера, что и HashSet, а затем передайте его методу toArray ():

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

Вам нужно изменить функцию doSomething(), чтобы она принимала массив Integer[] вместо int[]. Если это невозможно, вы бы преобразовали массив значений, возвращаемых toArray, в int[].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...