Créer liste de tableaux à partir de la matrice de
J'ai un tableau qui est initialisé comme:
Element[] array = {new Element(1), new Element(2), new Element(3)};
Je voudrais le convertir ce tableau en un objet de la classe ArrayList.
ArrayList<Element> arraylist = ???;
- Dans Java9 --> List<String> liste = Liste.d'(“Hello”, “World”, “de”, “Java”);
- Cette réponse est fausse, que ce ne retourne pas une
ArrayList
. L'Affiche a demandé spécifiquement pour cela. - Je crois qu'il n'a pas de mine à l'aide de la Liste de l'interface, parce que c'est la meilleure pratique. Mais si tu veux, ici - new ArrayList<>(la Liste.d'(“Hello”, “World”, “de”, “Java”));
- Le point n'est pas sur l'utilisation de l'interface, le point est que dans votre solution, de la liste retournée est inmodifiable. Qui pourrait être plus d'un problème, et une des raisons pourquoi il a demandé une liste de tableaux
Vous devez vous connecter pour publier un commentaire.
new ArrayList
appel est inutile aussi.List<ClassName> list = Arrays.asList(array)
Arrays.asList(array)
sans la passer dans une nouvelleArrayList
objet de fixer la taille de la liste. L'une des raisons les plus communes pour utiliser unArrayList
est d'être en mesure de changer dynamiquement de sa taille et de votre suggestion serait de l'empêcher.Collections.shuffle(Arrays.asList(myarray))
mélange les original array.Arrays.asList(a).get(0) == a
quanda
est unint[]
. C'est parce que de la façon dont leasList(Object...)
varargs résoudre. Un objet de typeint[]
est unObject
, pas unObject[]
, doncArrays.asList
est passé d'un tableau deObject
avec un seul élément: un tableau deint
.int[]
et l'équivalent en cas d'utilisation est comme suit:List<Integer> intList = new ArrayList<Integer>(Arrays.asList(intArray));
Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.remove(AbstractList.java:161) at ...
- ne sais pas commentAbstractList
suis là, mais vous ne voulez pas autour de lors de l'appel de supprimerList<Element> list = new ArrayList<>(Arrays.asList(array));
aurait suffi. La diamond opérateur de faire de l'inférence de type pour vous.Arrays.asList
est une classe qui hérite deAbstractList
et de ne pas mettre en œuvreremove
(qui est parce que vous ne pouvez pas supprimer le contenu d'un tableau)Arrays.asList(array)
va créer une liste dont le seul élément estarray
. La liste ne contient pasarray
's éléments.java.util.List.of(array)
qui vous donne une liste immuable (instance de la classe interneAbstractImmutableList
). Vous pouvez utilisernew ArrayList<>(List.of(array))
si vous avez besoin d'une liste modifiable. voir ListeDonné:
La réponse la plus simple est de le faire:
Cela fonctionne très bien. Mais quelques mises en garde:
ArrayList
. Sinon, vous aurez uneUnsupportedOperationException
.asList()
est soutenu par le tableau d'origine. Si vous modifiez le tableau d'origine, la liste sera modifiée. Cela peut être surprenant.java.util.ArrayList
. Les tableaux de.asList retourne en fait unjava.util.Arrays.ArrayList
qui n'est pas uneinstanceof
l'autre classe. Donc, un tiers d'entre elles est que si vous essayez de l'utiliser dans un contexte exigeant de ce qui précède, il ne fonctionnera pas.(vieux thread, mais seulement 2 cents comme aucune mention de Goyave ou d'autres libs et quelques autres détails)
Si Vous Le Pouvez, Utilisez La Goyave
Il est intéressant de souligner la Goyave façon, ce qui simplifie grandement ces manigances:
Utilisation
Pour une Liste Immuable
Utiliser le
ImmutableList
classe et de sonde()
etcopyOf()
usine méthodes (les éléments ne peuvent pas être null):Pour Une Mutable Liste
Utiliser le
Listes
classe et de sonnewArrayList()
usine méthodes:Veuillez également noter les méthodes similaires pour d'autres structures de données dans d'autres classes, par exemple dans
Configure
.Pourquoi Goyave?
L'attraction principale pourrait être de réduire l'encombrement dû aux médicaments génériques pour la sécurité, comme l'utilisation de la Goyave méthodes de fabrique permettre les types de déduire la plupart du temps. Toutefois, cet argument contient moins d'eau depuis Java 7 est arrivé avec le nouveau diamant de l'opérateur.
Mais ce n'est pas la seule raison (et Java 7 n'est pas encore partout): l'abréviation syntaxe est également très pratique, et les méthodes d'initialiseurs, comme on le voit ci-dessus, permettent d'écrire plus expressif code. Vous le faites dans une Goyave appel ce qui prend 2 avec le courant Java Collections.
Si Vous ne Pouvez pas...
Pour une Liste Immuable
Utiliser le JDK est
Tableaux
classe et de sonasList()
méthode de fabrique, enveloppé avec unCollections.unmodifiableList()
:Noter que le type retourné pour
asList()
est unList
à l'aide d'un bétonArrayList
mise en œuvre, mais il n'est PASjava.util.ArrayList
. C'est un intérieur de type, qui émule unArrayList
mais en fait directement référence le tableau transmis et la rend "write through" (les modifications sont reflétées dans le tableau).Il interdit à des modifications par le biais de certains de la
List
de l'API de méthodes par simple élargissement d'uneAbstractList
(donc, l'ajout ou la suppression d'éléments non pris en charge), mais il permet de faire des appels àset()
pour remplacer des éléments. Donc cette liste n'est pas vraiment immuable et un appel àasList()
doit être enveloppé avecCollections.unmodifiableList()
.Voir l'étape suivante si vous avez besoin d'une mutable liste.
Pour une Mutable Liste
Même que ci-dessus, mais enveloppé d'un réel
java.util.ArrayList
:À des Fins Éducatives: Le Bon vieux manuels
List
retourné parArrays.asList
est mutable que vous pouvez toujoursset
éléments - qu'il n'est pas redimensionnable. Pour immuable des listes sans Goyave vous pouvez mentionner lesCollections.unmodifiableList
.arrayToList
pour Java 1.5+ est incorrect. Vous êtes instanciating listes deString
, et en essayant de récupérer les chaînes à partir du tableau donné, au lieu d'utiliser le paramètre générique type,T
. Autre que cela, la bonne réponse, et +1 pour être la seule à y compris la méthode manuelle.Depuis que cette question est assez vieux, ça m'étonne que personne n'a suggéré la forme la plus simple encore:
De Java 5,
Arrays.asList()
prend un varargs paramètre et que vous n'avez pas à construire le tableau explicitement.List<String> a = Arrays.asList("first","second","third")
Assurez-vous que
myArray
est du même type queT
. Vous obtiendrez une erreur de compilation si vous essayez de créer unList<Integer>
à partir d'un tableau deint
, par exemple.D'une autre façon (bien qu'essentiellement équivalente à la
new ArrayList(Arrays.asList(array))
solution en terme de performance:Java 9
Dans Java 9, vous pouvez utiliser
Liste.de
statique méthode de fabrique, afin de créer unList
littérale. Quelque chose comme ce qui suit:Ce serait de retour d'un immuable liste contenant les trois éléments. Si vous voulez un mutable liste, transmettre cette liste à la
ArrayList
constructeur:JEP 269: le Confort de l'Usine de Méthodes pour les Collections
JEP 269 fournit certains commodité de l'usine de méthodes pour Java Collections API. Ces immuable, statique usine méthodes sont intégrées dans le
List
,Set
, etMap
interfaces en Java 9 et les versions ultérieures.Vous avez probablement juste besoin d'une Liste, pas une liste de tableaux. Dans ce cas, il vous suffit de faire:
set
méthode), vous ne pouvez pas modifier la taille de la liste (pasadd
ouremove
éléments)!ArrayList
.Une autre mise à jour, presque de fin d'année 2014, vous pouvez le faire avec Java 8 trop:
Quelques personnages pourraient être sauvées, si cela ne pourrait être qu'un
List
Collectors.toList()
retourne en fait unArrayList
.Si vous utilisez :
vous peut créer et remplir deux listes ! Le remplissage de deux fois une grande liste est exactement ce que vous ne voulez pas le faire, car il va créer un autre
Object[]
tableau à chaque fois que les besoins de capacité à être étendu.Heureusement le JDK mise en œuvre est rapide et
Arrays.asList(a[])
est très bien fait. Il permet de créer une sorte de liste de tableaux de Tableaux nommés.Liste de tableaux où l'Objet de[] points de données directement dans le tableau.Secondaires dangereux, c'est que si vous modifiez la table initiale, vous modifiez la Liste ! Êtes-vous sûr que vous voulez que ? Peut-être que oui, peut-être pas.
Si pas, le plus compréhensible est de faire ceci :
Ou comme le dit @glglgl, vous pouvez créer un autre organe indépendant ArrayList avec :
J'aime utiliser
Collections
,Arrays
, ou de Goyave. Mais si elle ne rentre pas, ou vous ne le sentez pas, il suffit d'écrire un autre inélégante ligne à la place.new ArrayList<T>(Arrays.asList(myArray));
partie qui vous décourager de l'utiliser. Les deux ne tout à fait la même chose et la même complexité.new ArrayList<T>(Arrays.asList(myArray));
fait de même, il copie leasList
à unArrayList
...Dans
Java 9
vous pouvez utiliser:En fonction de la question de la réponse à l'aide de java 1.7:
Cependant, il est préférable de toujours utiliser l'interface:
Vous pouvez le 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
comme tous dit que cela va le faire
et la commune nouvelle façon de créer la matrice est observableArrays
ObservableList: Une liste qui permet aux auditeurs de suivre les changements quand ils se produisent.
pour Java SE, vous pouvez essayer
qui est selon Oracle Docs
Mise À Jour De Java 9
aussi en Java 9 c'est un peu facile:
Vous pouvez également le faire avec des flux en Java 8.
Collectors.toList()
sera de retour uneArrayList
. Toutefois, cela peut varier dans de futures versions de java.Si vous voulez un type spécifique de collecte puis utilisezCollectors.toCollection()
au lieu où vous pouvez spécifier le type exact de collection que vous souhaitez créer.Depuis Java 8, il est un moyen plus facile de transformer:
Si on peut voir la définition de
Arrays.asList()
méthode, vous obtiendrez quelque chose comme ceci:Ainsi, vous pouvez initialiser
arraylist
comme ceci:Il y a peut être une autre réponse pour cette question.
Si vous consultez la déclaration de
java.util.Collections.addAll()
méthode, vous obtiendrez quelque chose comme ceci:Donc, ce code est également utile de faire
Une autre méthode simple consiste à ajouter tous les éléments de la matrice à une nouvelle liste de tableaux à l'aide d'une boucle for-each.
Si le tableau est d'un type primitif, les réponses données ne fonctionne pas. Mais depuis Java 8, vous pouvez utiliser:
char
tableau, soit.On peut facilement convertir un tableau à
ArrayList
.Nous utilisons l'interface de Collecte de
addAll()
méthode pour le but de copier le contenu d'une liste à l'autre.ArrayList
s constructeurs accepte un? extends Collection<T>
argument, de faire l'appel àaddAll
redondant.Même si il ya beaucoup de parfaitement écrit les réponses à cette question, je vais ajouter mes entrées.
Dire que vous avez
Element[] array = { new Element(1), new Element(2), new Element(3) };
New ArrayList peut être créé dans l'une des manières suivantes
Et ils ont très bien en charge toutes les opérations de ArrayList
Mais les opérations suivantes retourne juste une vue de Liste d'une liste de tableaux et non des ArrayList.
Par conséquent, ils vont donner d'erreur lorsque vous essayez de faire quelques ArrayList opérations
Plus sur la Liste à la représentation de la matrice de lien.
Façon la plus simple de le faire est par l'ajout de code suivant. Essayé et Testé.
De sortie est...
Bonjour
monde
Vous pouvez le faire en java 8 comme suit
ArrayList<String> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));
Déjà tout le monde a fourni une assez bonne réponse à votre problème.
Maintenant à partir de la toutes les suggestions, vous avez besoin de décider qui sera adapté à votre exigence. Il existe deux types de collecte dont vous avez besoin de savoir. L'un est non modifiée de la collecte et de l'autre une collection qui va vous permettre de modifier l'objet plus tard.
Donc, Ici, je vais donner l'exemple de deux cas d'utilisation.
Immuable la création de la collection :: Quand vous ne voulez pas modifier l'objet de collection après la création
List<Element> elementList = Arrays.asList(array)
Mutable création de la collection : Lorsque vous vous souhaiterez peut-être modifier le créé objet de collection après la création.
List<Element> elementList = new ArrayList<Element>(Arrays.asList(array));
List
retourné parArrays.asList
est juste un wrapper sur le tableau d'origine, et permet d'éléments individuels à être consulté et modifié parget
etset
. Vous devriez préciser que tu veux dire "pas d'ajouter ou de supprimer des éléments" au lieu de "immuable", ce qui signifie de ne pas changer du tout.Utiliser le code suivant pour convertir un ensemble d'éléments dans une liste de tableaux.
C'est une manière claire pour que
Vous pouvez créer un
ArrayList
à l'aide de Cactoos (je suis l'un des développeurs):Il n'y a aucune garantie que l'objet sera effectivement de classe
ArrayList
. Si vous avez besoin de cette garantie, faites ceci:List
et le reste de ses collections (ArrayList, etc...) est déjà trop difficile à gérer. Pourquoi vous voulez me faire souffrir plus 🙁Utilisez code ci-dessous
Java 8 Tableaux de la classe fournit un flux() méthode qui a surchargé les versions d'accepter à la fois primitive des tableaux et des tableaux d'Objets.
Il y a une autre option, si votre objectif est de générer une liste fixe au moment de l'exécution, qui est aussi simple qu'efficace:
L'avantage de ce modèle est que la liste est pour une fois pas généré de manière très intuitive et, par conséquent, est très facile à modifier, même avec des listes de grande taille ou complexes d'initialisation, tandis que de l'autre main, il contient toujours les mêmes Éléments sur tous les réels de l'exécution du programme (à moins de changer à un moment plus tard, bien sûr).