Я пытаюсь добавить массив Integer в Set следующим образом:

int[] arr = { 2, 6, 4 , 2, 3, 3, 1, 7 }; 
Set<Integer> set = new HashSet<Integer>(Arrays.asList(arr));

Я получаю сообщение об ошибке:

myTest.java:192: error: no suitable constructor found for HashSet(List<int[]>)
    Set<Integer> set = new HashSet<Integer>(Arrays.asList(arr));
                       ^
constructor HashSet.HashSet(Collection<? extends Integer>) is not applicable
  (argument mismatch; inferred type does not conform to upper bound(s)
      inferred: int[]
      upper bound(s): Integer,Object)
constructor HashSet.HashSet(int) is not applicable
  (argument mismatch; no instance(s) of type variable(s) T exist so that List<T> conforms to int)
 where T is a type-variable:
T extends Object declared in method <T>asList(T...)
Note: Some messages have been simplified; recompile with -Xdiags:verbose to        get full output
   1 error

Во-вторых, я также пытаюсь сделать следующее и все еще получаю ошибку,

int[] arr = { 2, 6, 4 , 2, 3, 3, 1, 7 }; 
Set<Integer> set = new HashSet<Integer>( );
Collections.addAll(set, arr);

Как правильно добавить целочисленный массив в Set в Java? Спасибо.

10
Arefe 27 Дек 2015 в 08:59

4 ответа

Лучший ответ

Вам необходимо использовать тип оболочки, чтобы использовать Arrays.asList(T...)

Integer[] arr = { 2, 6, 4, 2, 3, 3, 1, 7 };
Set<Integer> set = new HashSet<>(Arrays.asList(arr));

или добавьте элементы вручную, например

int[] arr = { 2, 6, 4, 2, 3, 3, 1, 7 };
Set<Integer> set = new HashSet<>();
for (int v : arr) {
    set.add(v);
}

Наконец, если вам нужно сохранить порядок вставки, вы можете использовать LinkedHashSet.

15
Elliott Frisch 27 Дек 2015 в 06:02

myTest.java:192: error: no suitable constructor found for HashSet(List<int[]>)

Обратите внимание, что массивы в java - это Objects, поэтому Arrays.asList(int[]) внутренне будет рассматривать int[] как отдельный элемент. Таким образом, <T> List<T> asList(T... a) создаст List<int[]> вместо List<Integer>, и поэтому вы не сможете создать Set<Integer> из коллекции массива (не элементов Integer).

Возможные решения могут быть такими: просто используйте Integer (класс-оболочку) вместо int (примитивный тип) (что уже указано в Elliott Frisch).

Если вы используете Java-8 и получаете int[] и не можете изменить на Integer[],

int[] arr = { 2, 6, 4, 2, 3, 3, 1, 7 };
Integer[] wrapper = Arrays.stream(arr).boxed().toArray(Integer[]::new);
Set<Integer> set = new HashSet<Integer>(Arrays.asList(wrapper));

Более того, как указано Louis Wasserman, если вы используете java-8, вы можете напрямую собирать элементы массива в Set.

Set<Integer> set = Arrays.stream(arr).boxed().collect(Collectors.toSet());
3
CoderCroc 28 Дек 2015 в 05:10

Вы пытаетесь вставить в значения Set int, но ваш Set хранит Integer.

+ Изменить

int[] arr = { 2, 6, 4, 2, 3, 3, 1, 7 };

К

Integer[] arr = { 2, 6, 4, 2, 3, 3, 1, 7 };

Также, поскольку вы собираетесь создать набор из массива целых чисел, помните, что целые числа имеют специальный пул кеша для целых чисел в диапазоне -127 to +128. Все объекты Integer со значением в этом диапазоне относятся к одним и тем же объектам в пуле. Следовательно, для целых чисел в наборе не будет выделяться новая память.

2
Aaditya Gavandalkar 27 Дек 2015 в 06:14

Начиная с Java 8, вы можете использовать Stream.

int[] arr = { 2, 6, 4 , 2, 3, 3, 1, 7 };

Set<Integer> set = Arrays.stream(number).boxed().collect(Collectors.toSet());

Это должно сработать.

2
anthonlavell 23 Июн 2019 в 16:33