Подтвердить что ты не робот

Как преобразовать Java HashSet <Integer> в примитивный массив int?

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

hashset.toArray();

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

void doSomething(int[] arr)

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

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

Ответ 1

Apache ArrayUtils имеет это (он по-прежнему повторяет за кулисами):

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Вы можете преобразовать Set<Integer> в Integer[] даже без Apache Utils:

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

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

Ответ 5

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

Ints.toArray(Collection<? extends Number> collection)

Ответ 6

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

Ответ 7

Попробуй это. Использование 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();

Ответ 8

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

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

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