583 votes

Comment convertir int[] en List<Integer> en Java ?

Comment puis-je convertir int[] en List<Integer> en Java ?

Bien sûr, je suis intéressé par toute autre réponse que de le faire en boucle, élément par élément. Mais s'il n'y a pas d'autre réponse, je choisirai celle-ci comme la meilleure pour montrer que cette fonctionnalité ne fait pas partie de Java.

0 votes

Nous pouvons faire usage de IntStream.Of(array).collect(Collectors.toList)

1 votes

@SarojKumarSahoo Il n'y a pas d'argument unique. collect en IntStream .

1 votes

Il n'y a pas build-in de le faire. Vous devez le faire manuellement, déclarer une ArrayList et ajouter chaque valeur de l'int Array à ArrayList. Quel manquement !

577voto

mikeyreilly Points 101

Cours d'eau

  1. En Java 8+, vous pouvez faire un flux de votre int le réseau. Appelez soit Arrays.stream o IntStream.of .
  2. Appelez [IntStream#boxed](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/stream/IntStream.html#boxed()) pour utiliser la conversion de boxe de int primitif à Integer objets.
  3. Rassembler dans une liste en utilisant Stream.collect( Collectors.toList() ) . Ou plus simplement, en Java 16+, appelez [Stream#toList()](https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/util/stream/Stream.html#toList()) .

Exemple :

int[] ints = {1,2,3};
List<Integer> list = Arrays.stream(ints).boxed().collect(Collectors.toList());

En Java 16 et plus :

List<Integer> list = Arrays.stream(ints).boxed().toList();

28 votes

Equivalent à : Arrays.stream(ints).boxed().collect(Collectors.toList()) ;

4 votes

@njfrost Vous avez raison et IntStream.of appelle juste Arrays.stream donc j'ai amélioré la réponse en suivant votre suggestion.

2 votes

Pour une raison quelconque, il semble que cela ne renvoie pas le type de résultat attendu sur Android Studio (fonctionne sur eclipse) Il dit, attendu List<Integer> trouvé List<Object>.

351voto

willcodejavaforfood Points 20365

Il n'y a pas de raccourci pour convertir de int[] a List<Integer> como Arrays.asList ne s'occupe pas de la mise en boîte et crée simplement un fichier List<int[]> ce qui n'est pas ce que vous voulez. Vous devez créer une méthode utilitaire.

int[] ints = {1, 2, 3};
List<Integer> intList = new ArrayList<Integer>(ints.length);
for (int i : ints)
{
    intList.add(i);
}

34 votes

Il est préférable d'initialiser la liste avec la taille du tableau.

0 votes

@David Rabinowitz - Je ne sais pas trop quoi répondre à cela :)

0 votes

Si vous tenez absolument à utiliser l'implémentation ArrayList, pourquoi ne pas utiliser le constructeur surchargé pour faire : new ArrayList(myArray) ?

194voto

louisgab Points 932

Également de bibliothèques de goyave ... com.google.common.primitives.Ints :

List<Integer> Ints.asList(int...)

13 votes

Celle-ci devrait être la bonne réponse. Voir la deuxième phrase de la question : "Bien sûr, je suis intéressé par toute autre réponse que de le faire en boucle, élément par élément."

1 votes

Merci, merci, merci ! Fonctionne également pour Longs.asList(long...).

3 votes

Il y a quelques subtilités ici. La liste retournée utilise le tableau fourni comme mémoire de sauvegarde, vous ne devez donc pas modifier le tableau. La liste ne garantit pas non plus l'identité des objets Integer qu'elle contient. C'est-à-dire que le résultat de list.get(0) == list.get(0) n'est pas spécifié.

56voto

Christoffer Points 6518

Je vais ajouter une autre réponse avec une méthode différente ; pas de boucle mais une classe anonyme qui utilisera les fonctionnalités de l'autoboxing :

public List<Integer> asList(final int[] is)
{
    return new AbstractList<Integer>() {
            public Integer get(int i) { return is[i]; }
            public int size() { return is.length; }
    };
}

1 votes

+1 ceci est plus court que le mien mais le mien fonctionne pour tous les types de primitives

7 votes

Bien qu'elle soit plus rapide et utilise moins de mémoire que la création d'une ArrayList, la contrepartie est que List.add() et List.remove() ne fonctionnent pas.

3 votes

J'aime bien cette solution pour les grands tableaux avec des schémas d'accès épars, mais pour les éléments fréquemment accédés, cela entraînerait de nombreuses instanciations inutiles d'Integer (par exemple, si vous accédez 100 fois au même élément). Il faudrait également définir un Iterator et envelopper la valeur de retour dans Collections.unmodifiableList.

47voto

Calm Storm Points 3899

Le plus petit morceau de code serait :

public List<Integer> myWork(int[] array) {
    return Arrays.asList(ArrayUtils.toObject(array));
}

où ArrayUtils vient de commons-lang :)

12 votes

Notez simplement ArrayUtils c'est une bibliothèque relativement importante pour une application Android

1 votes

L'opération inverse est décrite ici : stackoverflow.com/a/960507/1333157 ArrayUtils.toPrimitive(...) est la clé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X