J'utilise ce code pour convertir un Set
en un List
:
Map<String, List<String>> mainMap = new HashMap<>();
for (int i=0; i < something.size(); i++) {
Set<String> set = getSet(...); //returns different result each time
List<String> listOfNames = new ArrayList<>(set);
mainMap.put(differentKeyName, listOfNames);
}
Je veux éviter de créer une nouvelle liste à chaque itération de la boucle. Est-ce possible?
java
performance
list
set
Muhammad Imran Tariq
la source
la source
Réponses:
Vous pouvez utiliser la méthode List.addAll () . Il accepte une collection comme argument et votre ensemble est une collection.
EDIT: comme répondre à l'édition de la question.
Il est facile de voir que si vous voulez avoir un
Map
avecList
s comme valeurs, afin d'avoir k valeurs différentes, vous devez créer k listes différentes.Ainsi: Vous ne pouvez pas éviter de créer ces listes du tout, les listes devront être créées.
Solution possible:
déclarez votre
Map
comme unMap<String,Set>
ou à laMap<String,Collection>
place, et insérez simplement votre ensemble.la source
differentKeyName
change chaque itération? Voulez-vous réellementsomething.size()
différentes valeurs possibles dans vos cartes? Il est facile de voir qu'une carte avec desk
listes en tant que valeurs doit créer au moins desk
listes.Utilisez le constructeur pour le convertir:
la source
Également à partir de la bibliothèque Guava Collect, vous pouvez utiliser
newArrayList(Collection)
:Ce serait très similaire à la réponse précédente de amit , sauf que vous n'avez pas besoin de déclarer (ou d'instancier) un
list
objet.la source
ArrayList
constructeur.new ArrayList<>([your_set])
.Nous pouvons utiliser un seul liner en Java 8:
Voici un petit exemple:
la source
Je voulais un moyen très rapide de convertir mon jeu en liste et de le renvoyer, donc en une ligne, je l'ai fait
la source
Vous pouvez utiliser ce changement d'une ligne:
Arrays.asList(set.toArray(new Object[set.size()]))
la source
Je ferais :
la source
Comme il n'a pas été mentionné jusqu'à présent, à partir de Java 10, vous pouvez utiliser la nouvelle
copyOf
méthode d'usine:Depuis le Javadoc :
la source
Java 8 offre la possibilité d'utiliser des flux et vous pouvez obtenir une liste
Set<String> setString
sous la forme:Bien que l'implémentation interne fournisse à ce jour une instance de
ArrayList
:mais JDK ne le garantit pas. Comme mentionné ici :
Si vous voulez toujours être sûr, vous pouvez demander une instance spécifiquement comme:
la source
Je crée une
static
méthode simple :... ou si vous souhaitez définir le type de liste, vous pouvez utiliser:
la source
Récemment, j'ai trouvé ceci:
la source
public static <T> ArrayList<T> list(Enumeration<T> e) { ArrayList<T> l = new ArrayList<>(); while (e.hasMoreElements()) l.add(e.nextElement()); return l; }
Par souci d'exhaustivité ...
Supposons que vous souhaitiez vraiment traiter les
Map
valeurs comme desList
s, mais que vous souhaitiez éviter de les copierSet
àList
chaque fois.Par exemple, vous appelez peut-être une fonction de bibliothèque qui crée un
Set
, mais vous passez votreMap<String, List<String>>
résultat à une fonction de bibliothèque (mal conçue mais hors de vos mains) qui ne prend queMap<String, List<String>>
, même si vous savez d'une manière ou d'une autre que les opérations qu'il fait avec leList
s sont également applicables à toutCollection
(et donc à toutSet
). Et pour une raison quelconque, vous devez éviter la surcharge de vitesse / mémoire de la copie de chaque ensemble dans une liste.Dans ce cas de super niche, en fonction du comportement (peut-être inconnu) dont la fonction de bibliothèque a besoin dans vos
List
s, vous pourrez peut-être créer uneList
vue sur chaque ensemble. Notez que cela est intrinsèquement dangereux (car les exigences de la fonction de bibliothèque de chacunList
pourraient vraisemblablement changer à votre insu), donc une autre solution devrait être préférée. Mais voici comment vous le feriez.Vous devez créer une classe qui implémente l'
List
interface, prend unSet
dans le constructeur et affecte cet ensemble à un champ, puis utilise cette interneSet
pour implémenter l'List
API (dans la mesure du possible et souhaitée).Notez que certains comportements List que vous ne pourrez tout simplement pas imiter sans stocker les éléments en tant que
List
, et certains comportements que vous ne pourrez imiter que partiellement. Encore une fois, cette classe n'est pas un remplacement sûr pour lesList
s en général. En particulier, si vous savez que le cas d'utilisation nécessite des opérations liées à l'index ou une MUTATIONList
, cette approche irait très vite vers le sud.la source
J'ai trouvé que cela fonctionnait bien et utile pour créer une liste à partir d'un ensemble.
la source
la source