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" }));
A) int[] a...
à
B) Integer[] a ...
Merci!
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...);
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));
Vous pouvez utiliser ArrayUtils dans Apache Commons :
int[] intArray = { 1, 2, 3 };
Integer[] integerArray = ArrayUtils.toObject(intArray);
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