C'est peut-être une question un peu facile, du headdesk, mais ma première tentative a étonnamment échoué complètement. Je voulais prendre un tableau de longs primitifs et le transformer en une liste, ce que j'ai essayé de faire comme ceci:
long[] input = someAPI.getSomeLongs();
List<Long> inputAsList = Arrays.asList(input); //Total failure to even compile!
Quelle est la bonne façon de procéder?
java
arrays
collections
boxing
Brandon Yarbrough
la source
la source
Réponses:
J'ai trouvé pratique d'utiliser apache commons lang ArrayUtils ( JavaDoc , dépendance Maven )
il a également l'API inverse
EDIT: mis à jour pour fournir une conversion complète en liste comme suggéré par les commentaires et autres correctifs.
la source
Arrays.asList(ArrayUtils.toObject(input))
probablement.List<Long> = Arrays.asList(inputBoxed)
dans leur question, j'ai trouvé qu'il était redondant de le répéter car je pensais que c'était évident, je suppose que j'avais tort ...Depuis Java 8, vous pouvez désormais utiliser des flux pour cela:
la source
stream
fonction n'est définie que pourint[]
,long[]
etdouble[]
.LongStream.of(arr).boxed()...
.Arrays.stream(arr).boxed().collect(Collectors.toList());
Malheureusement, cela ne peut que revenirList<Object>
la source
hallidave et jpalecek ont la bonne idée - itérer sur un tableau - mais ils ne tirent pas parti d'une fonctionnalité fournie par
ArrayList
: puisque la taille de la liste est connue dans ce cas, vous devez la spécifier lorsque vous créez leArrayList
.De cette façon, aucun tableau inutile n'est créé uniquement pour être rejeté par le
ArrayList
car il s'avère trop court, et aucun «emplacement» vide n'est gaspillé parce qu'il aArrayList
surestimé ses besoins en espace. Bien sûr, si vous continuez à ajouter des éléments à la liste, un nouveau tableau de sauvegarde sera nécessaire.la source
Un peu plus verbeux, mais cela fonctionne:
Dans votre exemple, il semble que Arrays.asList () interprète l'entrée comme une liste de longs [] tableaux au lieu d'une liste de Longs. Un peu surprenant, c'est sûr. La boxe automatique ne fonctionne tout simplement pas comme vous le souhaitez dans ce cas.
la source
Comme autre possibilité, la bibliothèque Guava fournit cela comme
Longs.asList()
, avec des classes utilitaires similaires pour les autres types primitifs.la source
Non, il n'y a pas de conversion automatique du tableau de type primitif au tableau de leurs types de référence encadrés. Tu peux seulement faire
la source
La question demandait comment transformer un tableau en liste. La plupart des réponses à ce jour ont montré comment créer une nouvelle liste avec le même contenu que le tableau, ou faisant référence à des bibliothèques tierces. Cependant, il existe des options simples et intégrées pour ce type de conversion. Certains d'entre eux ont déjà été esquissés dans d'autres réponses (par exemple celle-ci ). Mais j'aimerais souligner et élaborer certains degrés de liberté pour la mise en œuvre ici, et montrer les avantages potentiels, les inconvénients et les mises en garde.
Il y a au moins deux distinctions importantes à faire:
Les options seront résumées ici rapidement, et un exemple de programme complet est affiché au bas de cette réponse.
Créer une nouvelle liste ou créer une vue sur la baie
Lorsque le résultat doit être une nouvelle liste, l'une des approches des autres réponses peut être utilisée:
Mais il faut tenir compte des inconvénients de cette opération: un tableau avec 1000000
long
valeurs occupera environ 8 mégaoctets de mémoire. La nouvelle liste occupera également environ 8 mégaoctets. Et bien sûr, le tableau complet doit être parcouru lors de la création de cette liste. Dans de nombreux cas, la création d'une nouvelle liste n'est tout simplement pas nécessaire. Au lieu de cela, il suffit de créer une vue sur le tableau:(Voir l'exemple en bas pour une implémentation de la
toList
méthode)L'implication d'avoir une vue sur le tableau est que les changements dans le tableau seront visibles dans la liste:
Heureusement, créer une copie (c'est-à-dire une nouvelle liste qui n'est pas affectée par les modifications du tableau) à partir de la vue est trivial:
Maintenant, il s'agit d'une copie fidèle, équivalente à ce qui est réalisé avec la solution basée sur le flux présentée ci-dessus.
Créer une vue modifiable ou une vue non modifiable
Dans de nombreux cas, cela suffira lorsque la liste est en lecture seule . Le contenu de la liste résultante ne sera souvent pas modifié, mais uniquement transmis au traitement en aval qui ne lit que la liste.
Permettre des modifications de la liste soulève quelques questions:
Il est possible de créer une vue de liste sur le tableau qui est modifiable . Cela signifie que les changements dans la liste, comme la définition d'une nouvelle valeur à un certain index, seront visibles dans le tableau.
Mais il n'est pas possible de créer une vue de liste structurellement modifiable . Cela signifie qu'il n'est pas possible d'effectuer des opérations qui affectent la taille de la liste. C'est simplement parce que la taille du tableau sous-jacent ne peut pas être modifiée.
Ce qui suit est un MCVE montrant les différentes options d'implémentation et les manières possibles d'utiliser les listes résultantes:
La sortie de l'exemple est affichée ici:
la source
Une autre façon avec Java 8.
la source
J'écris une petite bibliothèque pour ces problèmes:
Dans le cas où vous vous en souciez, vérifiez-le ici .
la source
Une autre façon avec Java 8.
la source
Arrays.stream(a).boxed().collect(Collectors.<Long>toList());
En combinant les réponses de Pavel et Tom, nous obtenons ceci
la source
Si vous voulez une sémantique similaire,
Arrays.asList
vous devrez écrire (ou utiliser l'implémentation client de quelqu'un d'autre) deList
(probablement viaAbstractList
. Elle devrait avoir à peu près la même implémentation que lesArrays.asList
valeurs box et unbox uniquement).la source
Vous pouvez utiliser transmorph :
Cela fonctionne également si la source est un tableau d'entiers par exemple.
la source
Je sais que cette question est assez ancienne, mais ... vous pouvez également écrire votre propre méthode de conversion:
Une fois que vous l'avez inclus à l'aide de l'importation statique, les utilisations possibles peuvent être:
ou
la source
catch (ArrayIndexOutOfBoundsException ex) { /* Finished getting array elements */ }
vous êtes une personne terrible.Bien qu'il soit possible de créer une nouvelle liste et d'y ajouter toutes les valeurs (via une boucle for ou des flux), j'ai travaillé sur de très gros tableaux et j'obtiens de mauvaises performances. Par conséquent, j'ai créé ma propre classe de wrapper de tableau primitif facile à utiliser.
Exemple:
Obtenez-le ici: https://github.com/Sf298/Sauds-Toolbox/blob/master/src/main/java/PrimitiveArrayWrapper/PrimitiveList.java
REMARQUE: je ne l'ai pas encore entièrement testé, alors faites-moi savoir si vous trouvez des bogues / problèmes.
la source
Vous pouvez utiliser
LongStream
pour celala source