web-dev-qa-db-fra.com

Tableau Java int [] en HashSet <Integer>

J'ai un tableau d'int:

int[] a = {1, 2, 3};

J'ai besoin d'un ensemble dactylographié:

Set<Integer> s;

Si je fais ce qui suit:

s = new HashSet(Arrays.asList(a));

il pense bien sûr que je veux dire:

List<int[]>

alors que je voulais dire:

List<Integer>

C'est parce que int est une primitive. Si j'avais utilisé String, tout fonctionnerait:

Set<String> s = new HashSet<String>(
    Arrays.asList(new String[] { "1", "2", "3" }));

Comment passer facilement, correctement et succinctement de:

A) int[] a...

à

B) Integer[] a ...

Merci!

22
Robottinosino

Quelques explications supplémentaires. La méthode asList a cette signature

public static <T> List<T> asList(T... a)

Donc, si vous faites ceci:

List<Integer> list = Arrays.asList(1, 2, 3, 4)

ou ca:

List<Integer> list = Arrays.asList(new Integer[] { 1, 2, 3, 4 })

Dans ces cas, je pense que Java est en mesure d'inférer que vous souhaitez récupérer une liste, il remplit donc le paramètre type, ce qui signifie qu'il attend les paramètres Integer pour l'appel de la méthode. Puisqu'il est capable de faire une liste automatique des valeurs de int à Integer, tout va bien.

Cependant, cela ne fonctionnera pas

List<Integer> list = Arrays.asList(new int[] { 1, 2, 3, 4} )

parce que la contrainte primitive à la compression (c'est-à-dire. int [] à Integer []) n'est pas intégrée au langage (vous ne savez pas pourquoi ils ne l'ont pas fait, mais ils ne l'ont pas fait).

En conséquence, chaque type de primitif devrait être traité comme sa propre méthode surchargée, ce que fait le paquetage common. c'est à dire.

public static List<Integer> asList(int i...);
13
Matt

La question pose deux questions distinctes: convertir int[] en Integer[] et créer un HashSet<Integer> à partir d'un int[]. Les deux sont faciles à faire avec les flux 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));
4
Jeffrey Bosboom

Vous pouvez utiliser ArrayUtils dans Apache Commons :

int[] intArray  = { 1, 2, 3 };
Integer[] integerArray = ArrayUtils.toObject(intArray);
3
Reimeus

Une autre option consisterait à utiliser un jeu de primitives à partir de Eclipse Collections . Vous pouvez facilement convertir un int[] en une MutableIntSet en un Set<Integer> ou Integer[] comme indiqué ci-dessous, ou vous pouvez utiliser la MutableIntSet telle quelle qui sera beaucoup plus efficace en termes de mémoire.

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[]{});

Si vous voulez aller directement du tableau int au tableau Integer et préserver l'ordre, cela fonctionnera.

Integer[] integers = 
        IntLists.mutable.with(a).collect(i -> i).toArray(new Integer[]{});

Remarque: je suis un partisan des collections Eclipse

1
Donald Raab