Quelle est la meilleure façon de convertir un Map<key,value>
en un List<value>
? Il suffit d'itérer sur toutes les valeurs et de les insérer dans une liste ou est-ce que j'oublie quelque chose?
Quelle est la meilleure façon de convertir un Map<key,value>
en un List<value>
? Il suffit d'itérer sur toutes les valeurs et de les insérer dans une liste ou est-ce que j'oublie quelque chose?
Réponses:
List<Value> list = new ArrayList<Value>(map.values());
en supposant:
Map<Key,Value> map;
Collection
à List
fonctionnerait.
keySet()
et values()
sont généralement des objets shim qui donnent une vue Set ou Collection de la structure sous-jacente ( keySet()
renvoie un Set pour ne mettre en évidence aucune dupe). Car values()
, l'objet retourné peut être un List
, mais ne le sera souvent pas. La création d'une véritable liste, comme vous le dites, rompt le lien, ce qui signifie que vous ne dépendez plus de la carte d'origine. Parfois cependant, vous n'avez besoin que d'une liste car certaines API en nécessitent une - renforçant la règle selon laquelle une bonne API ne doit nécessiter que les interfaces les plus abstraites avec
Le problème ici est qu'il Map
a deux valeurs (une clé et une valeur), tandis List
qu'un a une seule valeur (un élément).
Par conséquent, le mieux qui puisse être fait est d'obtenir une List
des clés ou des valeurs. (Sauf si nous créons un wrapper pour conserver la paire clé / valeur).
Disons que nous avons Map
:
Map<String, String> m = new HashMap<String, String>();
m.put("Hello", "World");
m.put("Apple", "3.14");
m.put("Another", "Element");
Les clés comme un List
peuvent être obtenues en créant un nouveau à ArrayList
partir d'un Set
retourné par la Map.keySet
méthode:
List<String> list = new ArrayList<String>(m.keySet());
Alors que les valeurs comme un List
peuvent être obtenues en créant un nouveau à ArrayList
partir d'un Collection
retourné par la Map.values
méthode:
List<String> list = new ArrayList<String>(m.values());
Le résultat de l'obtention List
des clés:
Pomme Un autre Bonjour
Le résultat de l'obtention List
des valeurs:
3.14 Élément Monde
HashMap
similaires non triées, Map
il sera effectivement aléatoire.
Utilisation de l'API Java 8 Streams.
List<Value> values = map.values().stream().collect(Collectors.toList());
une liste de quoi?
En supposant que map
votre instance deMap
map.values()
renverra un Collection
contenant toutes les valeurs de la carte.map.keySet()
renverra un Set
contenant toutes les clés de la carte.Je suppose que vous voulez convertir les valeurs contenues dans le Map
un list
? Le plus values()
simple est d'appeler la méthode de l' Map
interface. Cela renverra les Collection
objets de valeur contenus dans le Map
.
Notez que cela Collection
est soutenu par l' Map
objet et toutes les modifications apportées à l' Map
objet seront reflétées ici. Donc, si vous voulez une copie séparée non liée à votre Map
objet, créez simplement un nouvel List
objet comme un ArrayList
passage de la valeur Collection
comme ci-dessous.
ArrayList<String> list = new ArrayList<String>(map.values());
Vous pouvez le faire comme ça
List<Value> list = new ArrayList<Value>(map.values());
Si vous voulez vous assurer que les valeurs dans la résultante List<Value>
sont dans l'ordre des clés de l'entrée Map<Key, Value>
, vous devez en SortedMap
quelque sorte "passer par" .
Soit commencer avec un béton SortedMap
mise en œuvre (telle que TreeMap
) ou insérez votre entrée Map
en SortedMap
avant de la convertir à List
. par exemple:
Map<Key,Value> map;
List<Value> list = new ArrayList<Value>( new TreeMap<Key Value>( map ));
Sinon, vous obtiendrez tout l'ordre natif Map
fourni par l' implémentation, qui peut souvent être autre chose que l'ordre des clés naturelles (Try Hashtable
ou ConcurrentHashMap
, pour varier).
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("java", 20);
map.put("C++", 45);
Set <Entry<String, Integer>> set = map.entrySet();
List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(set);
nous pouvons avoir à la fois la clé et la paire de valeurs dans la liste. Vous pouvez également obtenir la clé et la valeur en utilisant Map.Entry en itérant sur la liste.
// you can use this
List<Value> list = new ArrayList<Value>(map.values());
// or you may use
List<Value> list = new ArrayList<Value>();
for (Map.Entry<String, String> entry : map.entrySet())
{
list.add(entry.getValue());
}
"Map<String , String > map = new HapshMap<String , String>;
map.add("one","java");
map.add("two" ,"spring");
Set<Entry<String,String>> set = map.entrySet();
List<Entry<String , String>> list = new ArrayList<Entry<String , String>> (set);
for(Entry<String , String> entry : list ) {
System.out.println(entry.getKey());
System.out.println(entry.getValue());
} "
Voici la méthode générique pour obtenir des valeurs de la carte.
public static <T> List<T> ValueListFromMap(HashMap<String, T> map) {
List<T> thingList = new ArrayList<>();
for (Map.Entry<String, T> entry : map.entrySet()) {
thingList.add(entry.getValue());
}
return thingList;
}
HashMap<Integer, List<String>> map = new HashMap<>();
List<String> list = new ArrayList<String>();
list.add("Java");
list.add("Primefaces");
list.add("JSF");
map.put(1,list);
if(map != null){
return new ArrayList<String>((Collection<? extends String>) map.values());
}