Convertir un tableau de primitif aspire dans une Liste de Longs
Cela peut être un peu facile, headdesk genre de question, mais ma première tentative, étonnamment, n'a pas complètement de travailler. Je voulais prendre un tableau de primitif longs et d'en faire une liste, 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 le faire?
- Je pense que nous avons eu la même question pour les entiers, n'est-ce pas?
- oui: stackoverflow.com/questions/1467913/...
Vous devez vous connecter pour publier un commentaire.
Je trouve qu'il est pratique de le faire à l'aide d'apache commons lang ArrayUtils (JavaDoc, Maven dependency)
il a aussi l'inverse de l'API
EDIT: mis à jour afin de fournir un ensemble de conversion à une liste comme suggéré par des commentaires et d'autres correctifs.
Arrays.asList(ArrayUtils.toObject(input))
probablement.List<Long> = Arrays.asList(inputBoxed)
dans leur question, j'ai trouvé, il aurait été inutile de le répéter, comme je pensais que c'était évident, je suppose que je me trompais...List<Long>
n'a pas de nom de variable!Depuis Java 8 vous pouvez maintenant utiliser les flux pour que:
stream
fonction n'est définie pourint[]
,long[]
etdouble[]
.LongStream.of(arr).boxed()...
.Arrays.stream(arr).boxed().collect(Collectors.toList());
Malheureusement, cela ne peut que retournerList<Object>
hallidave et jpalecek ont la bonne idée—une itération sur un tableau—mais ils ne profitent pas d'une fonctionnalité fournie par
ArrayList
: depuis la taille de la liste est connu dans ce cas, vous devez le spécifier lorsque vous créez leArrayList
.De cette façon, pas de superflu tableaux sont créés uniquement à être rejeté par le
ArrayList
parce qu'ils s'avèrent être trop court, et pas vide de "slots" sont perdues parce que lesArrayList
surestimé ses exigences en matière d'espace. Bien sûr, si vous continuez à ajouter des éléments à la liste, un nouveau support de tableau sera nécessaire.Un peu plus verbeux, mais cela fonctionne:
Dans votre exemple, il apparaît que les Tableaux.asList() est l'interprétation de l'entrée de liste de long[] tableaux au lieu d'une liste de Longs. Un peu surprenant, pour sûr. L'autoboxing ne fonctionne tout simplement pas la façon dont vous le souhaitez dans ce cas.
Comme autre possibilité, la Goyave bibliothèque fournit ce que
Longs.asList()
, avec les mêmes classes utilitaires pour les autres types de primitives.Non, il n'y a pas de conversion automatique depuis le tableau de primitives de type tableau de leur boîte de types de référence. Vous ne pouvez le faire
D'une autre façon avec Java 8.
Je suis en train d'écrire une petite bibliothèque pour ces problèmes:
Dans le cas vous vous souciez de vérifier ici.
La question posée sur la façon de transformer un tableau dans une liste. La plupart des réponses jusqu'à présent ont montré comment créer un nouveau liste avec le même contenu, comme le tableau, ou en référence à des bibliothèques tierces. Cependant, il y a de simple, intégré dans les options pour ce genre de conversion. Certains d'entre eux ont déjà été esquissé dans d'autres réponses (par exemple,cette une). Mais je tiens à souligner et développer certains degrés de liberté pour la mise en œuvre ici, et de montrer le potentiel des avantages, des inconvénients et des mises en garde.
Il y a au moins deux distinctions importantes à faire:
Les options seront résumés ici rapidement, et un exemple complet de programme est affiché au bas de cette réponse.
La création d'une nouvelle liste en rapport à la création d'un vue sur le tableau
Lorsque le résultat devrait être une nouveau liste, puis l'une des approches de l'autre les réponses peuvent être utilisés:
Mais on doit considérer les inconvénients de le faire: Un tableau avec 1000000
long
valeurs occupent environ 8 méga-octets de mémoire. La nouvelle liste sera aussi occupent environ 8 mo. Et bien sûr, toute la gamme a être parcourus lors de la création de cette liste. Dans de nombreux cas, la création d'une nouvelle liste est tout simplement pas nécessaire. Au lieu de cela, il suffit de créer un vue sur le tableau:(Voir l'exemple dans le bas pour une mise en œuvre de la
toList
méthode)L'implication d'avoir un vue sur le tableau sont que des changements dans la matrice sera visible dans la liste:
Heureusement, la création d'une copie (c'est un nouveau liste qui n'est pas affectée par les modifications dans le tableau) à partir de la vue est trivial:
Maintenant, c'est une copie conforme, soit l'équivalent de ce qui est réalisé avec la solution d'analyse de flux qui a été montré ci-dessus.
La création d'un modifiables vue ou un inmodifiable vue
Dans de nombreux cas, il sera suffisant lorsque la liste est en lecture seule. Le contenu de la liste résultante souvent de ne pas être modifié, mais seulement passé pour le traitement en aval qui ne lit la liste.
Permettant des modifications de la liste des questions à se poser:
Il est possible de créer une vue de liste sur le tableau qui est modifiables. Cela signifie que les changements dans la liste, comme la fixation d'une nouvelle valeur à un certain indice, sera visible dans le tableau.
Mais il n'est pas possible de créer une liste structurellement modifiables. Cela signifie qu'il n'est pas possible de faire les opérations qui affectent la taille de la liste. C'est tout simplement parce que la taille du sous-jacent tableau ne peut pas être modifié.
Ce qui suit est une MCVE montrant les différentes options de mise en œuvre, et la manière d'utiliser les listes résultant:
La sortie de l'exemple est illustré ici:
Combinant Pavel et Tom les réponses que nous obtenons cette
Un autre façon avec Java 8.
Arrays.stream(a).boxed().collect(Collectors.<Long>toList());
Si vous voulez sémantique similaire à
Arrays.asList
ensuite, vous aurez besoin d'écrire (ou utiliser un autre client de la mise en œuvre deList
(probablement par le biais deAbstractList
. Il devrait avoir la même mise en œuvre queArrays.asList
, seulement boîte et unbox valeurs.Vous pouvez utiliser transmorph :
Il fonctionne également si la source est un tableau d'entiers par exemple.
Je sais que cette question est assez vieux, mais... vous pouvez également écrire votre propre méthode de conversion:
Après l'inclure à l'aide de statique à l'importation, utilisations possibles pourraient être:
ou
catch (ArrayIndexOutOfBoundsException ex) { /* Finished getting array elements */ }
, vous êtes une personne terrible.Alors qu'il est possible de créer une nouvelle Liste et d'y ajouter toutes les valeurs (par l'intermédiaire de la boucle ou des cours d'eau), j'ai travaillé sur de grands tableaux et d'obtenir des performances médiocres. Donc j'ai créé mon propre facile à utiliser primitive de la matrice de classe wrapper.
Exemple:
L'obtenir ici:
https://github.com/Sf298/Sauds-Toolbox/blob/master/src/main/java/PrimitiveArrayWrapper/PrimitiveList.java
REMARQUE: je n'ai pas entièrement encore testé, alors laissez-moi savoir si vous trouvez des bugs/problèmes.
Vous pouvez utiliser
LongStream
pour que