Массив Java int [] для HashSet <Integer>
У меня есть массив int:
int[] a = {1, 2, 3};
Мне нужен набор из него:
Set<Integer> s;
Если я делаю следующее:
s = new HashSet(Arrays.asList(a));
он, конечно, думает, что я имею в виду:
List<int[]>
тогда как я имел в виду:
List<Integer>
Это потому, что int является примитивным. Если бы я использовал String, все бы работало:
Set<String> s = new HashSet<String>(
Arrays.asList(new String[] { "1", "2", "3" }));
Как легко, правильно и лаконично перейти от:
A) int[] a...
к
B) Integer[] a ...
Спасибо!
Ответы
Ответ 1
Некоторые дополнительные объяснения. Метод asList имеет эту подпись
public static <T> List<T> asList(T... a)
Итак, если вы это сделаете:
List<Integer> list = Arrays.asList(1, 2, 3, 4)
или это:
List<Integer> list = Arrays.asList(new Integer[] { 1, 2, 3, 4 })
В этих случаях я считаю, что java может сделать вывод о том, что вы хотите вернуть список, поэтому он заполняет параметр типа, что означает, что он ожидает, что параметры Integer будут вызваны вызовом метода. Так как он способен автобоксать значения от int до Integer, это прекрасно.
Однако это не сработает
List<Integer> list = Arrays.asList(new int[] { 1, 2, 3, 4} )
поскольку примитив к принуждению оболочки (т.е. int [] к Integer []) не встроен в язык (не уверен, почему они этого не сделали, но они этого не сделали).
В результате каждый примитивный тип должен обрабатываться как собственный перегруженный метод, что и делает пакет commons. то есть.
public static List<Integer> asList(int i...);
Ответ 2
Или вы можете легко использовать Guava для преобразования int[]
в List<Integer>
:
Ints.asList(int...)
asList
public static List<Integer> asList(int... backingArray)
Возвращает список фиксированного размера, поддерживаемый указанным массивом, похожим на Arrays.asList(Object[])
. Список поддерживает List.set(int, Object)
, но любая попытка установить значение null
приведет к NullPointerException
.
Возвращаемый список поддерживает значения, а не идентификаторы, объектов Integer
, написанных или прочитанных с него. Например, не соответствует ли list.get(0) == list.get(0)
для возвращаемого списка.
Ответ 3
Вы можете использовать ArrayUtils в Apache Commons:
int[] intArray = { 1, 2, 3 };
Integer[] integerArray = ArrayUtils.toObject(intArray);
Ответ 4
Вопрос задает два отдельных вопроса: преобразование int[]
в Integer[]
и создание HashSet<Integer>
из int[]
. Оба легко связаны с потоками Java 8:
int[] array = ...
Integer[] boxedArray = IntStream.of(array).boxed().toArray(Integer[]::new);
Set<Integer> set = IntStream.of(array).boxed().collect(Collectors.toSet());
//or if you need a HashSet specifically
HashSet<Integer> hashset = IntStream.of(array).boxed()
.collect(Collectors.toCollection(HashSet::new));
Ответ 5
Другой вариант - использовать примитивный набор из Eclipse Collections. Вы можете легко преобразовать int[]
в MutableIntSet
в Set<Integer>
или Integer[]
, как показано ниже, или вы можете использовать MutableIntSet
как это будет гораздо более эффективно и эффективно.
int[] a = {1, 2, 3};
MutableIntSet intSet = IntSets.mutable.with(a);
Set<Integer> integerSet = intSet.collect(i -> i); // auto-boxing
Integer[] integerArray = integerSet.toArray(new Integer[]{});
Если вы хотите перейти непосредственно из массива int к массиву Integer и сохранить порядок, это будет работать.
Integer[] integers =
IntLists.mutable.with(a).collect(i -> i).toArray(new Integer[]{});
Примечание: я являюсь коммиттером для коллекций Eclipse