Как я могу преобразовать Java HashSet<Integer> в примитивный массив int?
Вопрос
У меня есть HashSet<Integer>
с кучей Integers
в нем.Я хочу превратить его в массив, но вызываю
hashset.toArray();
возвращает Object[]
.Есть ли лучший способ преобразовать его в массив int
кроме перебора каждого элемента вручную?Я хочу передать массив в
void doSomething(int[] arr)
который не примет массив Object[], даже если я попытаюсь привести его следующим образом
doSomething((int[]) hashSet.toArray());
Решение
Апачи Массивы имеет это (это все еще повторяется за кулисами):
doSomething(ArrayUtils.toPrimitive(hashset.toArray()));
Это всегда хорошее место, чтобы проверить наличие подобных вещей.
Другие советы
Вы можете создать int[]
из любого Collection<Integer>
(включая HashSet<Integer>
) использование потоков Java 8:
int[] array = coll.stream().mapToInt(Number::intValue).toArray();
Разумеется, библиотека все еще выполняет итерацию по коллекции (или другому источнику потока) от вашего имени.
Помимо краткости и отсутствия внешних библиотечных зависимостей, потоки также позволяют работать параллельно, если у вас действительно большая коллекция для копирования.
public int[] toInt(Set<Integer> set) {
int[] a = new int[set.size()];
int i = 0;
for (Integer val : set) a[i++] = val;
return a;
}
Теперь, когда я написал код для вас, это уже не то руководство, не так ли?;)
Вы можете преобразовать Set<Integer>
Для Integer[]
даже без утилит Apache:
Set<Integer> myset = new HashSet<Integer>();
Integer[] array = myset.toArray(new Integer[0]);
Однако, если вам нужно int[]
вы должны выполнить итерацию по набору.
Вы можете просто использовать Гуаву:
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(T[] contents) метода toArray().Создайте пустой массив целых чисел того же размера, что и HashSet, а затем передайте его методу toArray():
Integer[] myarray = new Integer[hashset.size()];
doSomething(hashset.toArray(myarray));
Вам пришлось бы изменить doSomething()
функция для принятия Integer[]
массив вместо int[]
.Если это невозможно, вам придется преобразовать массив значений, возвращаемых toArray
Для int[]
.