J'ai un tableau qui est initialisé comme:
Element[] array = {new Element(1), new Element(2), new Element(3)};
Je voudrais convertir ce tableau en un objet de la ArrayList
classe.
ArrayList<Element> arraylist = ???;
java
arrays
arraylist
type-conversion
Ron Tuffin
la source
la source
ArrayList
. L'affiche a demandé spécifiquement cela.Réponses:
la source
new ArrayList
appel est également inutile.List<ClassName> list = Arrays.asList(array)
Arrays.asList(array)
sans le passer dans un nouvelArrayList
objet fixera la taille de la liste. L'une des raisons les plus courantes d'utiliser unArrayList
est de pouvoir modifier dynamiquement sa taille, et votre suggestion empêcherait cela.Donné:
La réponse la plus simple est de faire:
Cela fonctionnera bien. Mais quelques mises en garde:
ArrayList
. Sinon, vous obtiendrez unUnsupportedOperationException
.asList()
est sauvegardée par le tableau d'origine. Si vous modifiez le tableau d'origine, la liste sera également modifiée. Cela peut surprendre.la source
java.util.ArrayList
. Arrays.asList renvoie en fait unjava.util.Arrays.ArrayList
qui n'est pas uninstanceof
autre classe. Donc, une troisième mise en garde est que si vous essayez de l'utiliser dans un contexte nécessitant ce qui précède, cela ne fonctionnera pas.(ancien fil, mais seulement 2 cents car aucun ne mentionne Guava ou d'autres bibliothèques et quelques autres détails)
Si vous le pouvez, utilisez la goyave
Il convient de souligner la manière Guava, qui simplifie considérablement ces manigances:
Usage
Pour une liste immuable
Utilisez la
ImmutableList
classe et ses méthodesof()
etcopyOf()
usine (les éléments ne peuvent pas être nuls) :Pour une liste Mutable
Utilisez la
Lists
classe et sesnewArrayList()
méthodes d'usine:Veuillez également noter les méthodes similaires pour d'autres structures de données dans d'autres classes, par exemple dans
Sets
.Pourquoi la goyave?
L'attraction principale pourrait être de réduire l'encombrement dû aux génériques pour la sécurité des types, car l'utilisation des méthodes de l'usine de goyave permet de déduire les types la plupart du temps. Cependant, cet argument détient moins d'eau depuis l'arrivée de Java 7 avec le nouvel opérateur diamantaire.
Mais ce n'est pas la seule raison (et Java 7 n'est pas encore partout): la syntaxe raccourcie est également très pratique, et les initialiseurs de méthodes, comme vu ci-dessus, permettent d'écrire du code plus expressif. Vous faites dans un appel Guava ce qui prend 2 avec les collections Java actuelles.
Si vous ne pouvez pas ...
Pour une liste immuable
Utilisez la
Arrays
classe du JDK et saasList()
méthode d'usine, enveloppée par unCollections.unmodifiableList()
:Notez que le type retourné pour
asList()
est uneList
utilisation d'uneArrayList
implémentation concrète , mais il ne l'est PASjava.util.ArrayList
. C'est un type interne, qui émule unArrayList
mais fait en fait directement référence au tableau passé et le fait "écrire" (les modifications sont reflétées dans le tableau).Il interdit les modifications à travers certaines des
List
méthodes de l' API en étendant simplement unAbstractList
(donc, l'ajout ou la suppression d'éléments n'est pas pris en charge), mais il permet aux appelsset()
de remplacer les éléments. Ainsi, cette liste n'est pas vraiment immuable et un appel àasList()
devrait être terminéCollections.unmodifiableList()
.Consultez l'étape suivante si vous avez besoin d'une liste modifiable.
Pour une liste Mutable
Comme ci-dessus, mais enveloppé d'un réel
java.util.ArrayList
:À des fins éducatives: Le bon vieux manuel
la source
List
retourné parArrays.asList
est modifiable en ce que vous pouvez toujours desset
éléments - il n'est tout simplement pas redimensionnable. Pour les listes immuables sans goyave, vous pourriez mentionnerCollections.unmodifiableList
.arrayToList
for Java 1.5+ is incorrect. Vous instanciation listes deString
, et d' essayer de récupérer des chaînes du tableau donné, au lieu d'utiliser le type de paramètre génériqueT
. En dehors de cela, bonne réponse et +1 pour être le seul à inclure la méthode manuelle.O(1)
, mais pour l'immuabilité, vous devez faire une copie, par exemple, parCollections.unmodifiableList(new ArrayList<>(Arrays.asList(array)))
.Comme cette question est assez ancienne, cela m'étonne que personne n'ait encore suggéré la forme la plus simple:
Depuis Java 5,
Arrays.asList()
prend un paramètre varargs et vous n'avez pas à construire le tableau explicitement.la source
List<String> a = Arrays.asList("first","second","third")
Assurez-vous qu'il
myArray
s'agit du même type queT
. Vous obtiendrez une erreur de compilation si vous essayez de créer un àList<Integer>
partir d'un tableau deint
, par exemple.la source
Une autre façon (bien qu'elle soit essentiellement équivalente à la
new ArrayList(Arrays.asList(array))
solution en termes de performances:la source
Java 9
Dans Java 9 , vous pouvez utiliser
List.of
la méthode d'usine statique pour créer unList
littéral. Quelque chose comme ceci:Cela retournerait une liste immuable contenant trois éléments. Si vous voulez une liste mutable , passez cette liste au
ArrayList
constructeur:JEP 269: Méthodes de commodité pour les collections
JEP 269 fournit des méthodes d'usine pratiques pour l' API Java Collections . Ces méthodes d'usine statiques immuables sont intégrés dans les
List
,Set
et lesMap
interfaces en Java 9 et versions ultérieures.la source
Vous avez probablement juste besoin d'une liste, pas d'une liste de tableaux. Dans ce cas, vous pouvez simplement faire:
la source
set
méthode), vous ne pouvez pas changer la taille de la liste (pasadd
ouremove
éléments)!Une autre mise à jour, se terminant presque l'année 2014, vous pouvez aussi le faire avec Java 8:
Quelques caractères seraient enregistrés, si cela pouvait être juste un
List
la source
Collectors.toList()
renvoie en fait unArrayList
.Si tu utilises :
vous pouvez créer et remplir deux listes! Remplir deux fois une grande liste est exactement ce que vous ne voulez pas faire car cela créera une autre
Object[]
baie à chaque fois que la capacité doit être étendue.Heureusement, l'implémentation JDK est rapide et
Arrays.asList(a[])
très bien réalisée. Il crée une sorte d'ArrayList nommée Arrays.ArrayList où les données Object [] pointent directement vers le tableau.Le côté dangereux est que si vous changez le tableau initial, vous changez la liste! Êtes-vous sûr de vouloir cela? Peut-être que oui peut-être que non.
Sinon, la façon la plus compréhensible est de le faire:
Ou comme l'a dit @glglgl, vous pouvez créer un autre ArrayList indépendant avec:
J'aime utiliser
Collections
,Arrays
ou goyave. Mais si cela ne correspond pas, ou si vous ne le sentez pas, écrivez simplement une autre ligne inélégante à la place.la source
new ArrayList<T>(Arrays.asList(myArray));
partie que vous découragez d'utiliser. Les deux font tout à fait la même chose et ont la même complexité.new ArrayList<T>(Arrays.asList(myArray));
fait de même, il copie leasList
dans unArrayList
...Dans
Java 9
vous pouvez utiliser:la source
Selon la question, la réponse à l'aide de Java 1.7 est:
Cependant, il vaut mieux toujours utiliser l'interface:
la source
la source
Vous pouvez convertir en utilisant différentes méthodes
List<Element> list = Arrays.asList(array);
List<Element> list = new ArrayList();
Collections.addAll(list, array);
Arraylist list = new Arraylist();
list.addAll(Arrays.asList(array));
Pour plus de détails, vous pouvez vous référer à http://javarevisited.blogspot.in/2011/06/converting-array-to-arraylist-in-java.html
la source
comme tous l'ont dit, cela
et la plus récente façon courante de créer un tableau est observableArrays
ObservableList: une liste qui permet aux auditeurs de suivre les changements lorsqu'ils se produisent.
pour Java SE, vous pouvez essayer
c'est selon Oracle Docs
Mettre à jour Java 9
aussi en Java 9 c'est un peu facile:
la source
Depuis Java 8, il existe un moyen plus simple de transformer:
la source
Vous pouvez également le faire avec stream dans Java 8.
la source
Collectors.toList()
renverra unArrayList
. Cependant, cela peut différer dans les versions futures sur java.Si vous voulez un type spécifique de collection, utilisezCollectors.toCollection()
plutôt où vous pouvez spécifier le type exact de collection que vous souhaitez créer.Si nous voyons la définition de la
Arrays.asList()
méthode, vous obtiendrez quelque chose comme ceci:Donc, vous pouvez initialiser
arraylist
comme ceci:Il pourrait également y avoir une autre réponse à cette question.
Si vous voyez une déclaration de
java.util.Collections.addAll()
méthode, vous obtiendrez quelque chose comme ceci:Donc, ce code est également utile pour ce faire
la source
Un autre moyen simple consiste à ajouter tous les éléments du tableau à une nouvelle liste de tableaux à l'aide d'une boucle for-each.
la source
Si le tableau est de type primitif, les réponses données ne fonctionneront pas. Mais depuis Java 8, vous pouvez utiliser:
la source
char
tableau.Vous pouvez le faire en java 8 comme suit
la source
ArrayList<String> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));
Nous pouvons facilement convertir un tableau en
ArrayList
. Nous utilisons laaddAll()
méthode de l' interface Collection dans le but de copier du contenu d'une liste à une autre.la source
ArrayList
constructeurs s accepte un? extends Collection<T>
argument, ce qui rend l'appeladdAll
redondant.Même s'il existe de nombreuses réponses parfaitement écrites à cette question, je vais ajouter mes entrées.
Dis que tu as
Element[] array = { new Element(1), new Element(2), new Element(3) };
La nouvelle liste de tableaux peut être créée des manières suivantes
Et ils supportent très bien toutes les opérations d'ArrayList
Mais les opérations suivantes ne renvoient qu'une vue List d'un ArrayList et non un ArrayList réel.
Par conséquent, ils donneront une erreur lors de la tentative de certaines opérations ArrayList
Plus d'informations sur la représentation de liste du lien de tableau .
la source
Le moyen le plus simple de le faire consiste à ajouter le code suivant. Essayé et testé.
la source
La sortie est ...
Bonjour tout le
monde
la source
Utilisez le code suivant pour convertir un tableau d'éléments en ArrayList.
la source
Tout le monde a déjà fourni suffisamment de bonnes réponses à votre problème. Maintenant, à partir de toutes les suggestions, vous devez décider qui correspondra à vos besoins. Il existe deux types de collection que vous devez connaître. L'une est une collection non modifiée et une autre collection qui vous permettra de modifier l'objet plus tard.
Donc, ici, je vais donner un court exemple pour deux cas d'utilisation.
Création de collection immuable :: Lorsque vous ne souhaitez pas modifier l'objet de collection après la création
List<Element> elementList = Arrays.asList(array)
Création de collection Mutable :: Quand vous voudrez peut-être modifier l'objet de collection créé après la création.
List<Element> elementList = new ArrayList<Element>(Arrays.asList(array));
la source
List
retourné parArrays.asList
n'est qu'un wrapper sur le tableau d'origine, et permet d'accéder et de modifier des éléments individuels viaget
etset
. Vous devriez probablement préciser que vous voulez dire "ne pas ajouter ou supprimer d'éléments" au lieu de "immuable", ce qui signifie ne pas changer du tout.Tableau d'objets donné:
Convertir un tableau en liste:
Convertir un tableau en liste de tableaux
Convertir un tableau en LinkedList
Imprimer la liste:
PRODUCTION
1
2
3
la source
La classe Arrays de Java 8 fournit une méthode stream () qui a des versions surchargées acceptant à la fois les tableaux primitifs et les tableaux d'objets.
la source
Le code ci-dessous semble une bonne façon de le faire.
la source