Ответ 1
Apache ArrayUtils имеет это (он по-прежнему повторяет за кулисами):
doSomething(ArrayUtils.toPrimitive(hashset.toArray()));
Они всегда хорошо подходят для таких вещей.
У меня есть HashSet<Integer>
с кучей Integers
. Я хочу превратить его в массив, но называя
hashset.toArray();
возвращает Object[]
. Есть ли лучший способ передать его в массив int
, отличный от итерации через каждый элемент вручную? Я хочу передать массив в
void doSomething(int[] arr)
который не примет массив Object [], даже если я попытаюсь выполнить его как
doSomething((int[]) hashSet.toArray());
Apache ArrayUtils имеет это (он по-прежнему повторяет за кулисами):
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 Utils:
Set<Integer> myset = new HashSet<Integer>();
Integer[] array = myset.toArray(new Integer[0]);
Однако, если вам нужно int[]
, вам нужно выполнить итерацию по набору.
Вы можете просто использовать Guava:
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 []) метода toArray(). Создайте пустой массив из int с тем же размером, что и HashSet, а затем передайте его методу toArray():
Integer[] myarray = new Integer[hashset.size()];
doSomething(hashset.toArray(myarray));
Вам нужно будет изменить функцию doSomething()
, чтобы принять массив Integer[]
вместо int[]
. Если это невозможно, вы должны преобразовать массив значений, возвращаемых toArray
в int[]
.