Qual è il modo migliore per convertire a Map<key,value>
in a List<value>
? Basta scorrere tutti i valori e inserirli in un elenco o sto trascurando qualcosa?
Qual è il modo migliore per convertire a Map<key,value>
in a List<value>
? Basta scorrere tutti i valori e inserirli in un elenco o sto trascurando qualcosa?
Risposte:
List<Value> list = new ArrayList<Value>(map.values());
assumendo:
Map<Key,Value> map;
Collection
a List
avrebbe funzionato.
keySet()
e values()
sono generalmente oggetti shim che danno una vista Set o Collection della struttura sottostante ( keySet()
restituisce un Set per enfatizzare i non duplicati). Per values()
, l'oggetto restituito può essere un List
, ma spesso non lo sarà. La creazione di un vero elenco, come dici tu, interrompe il collegamento, il che significa che non sei più dipendente dalla mappa originale. A volte però, hai solo bisogno di un Elenco perché alcune API ne richiedono una - il rafforzamento della regola secondo cui una buona API dovrebbe richiedere solo le interfacce più astratte con cui può cavarsela ...
Il problema qui è che Map
ha due valori (una chiave e un valore), mentre uno List
ha un solo valore (un elemento).
Pertanto, il meglio che si può fare è ottenere una List
delle chiavi o i valori. (A meno che non creiamo un wrapper per aggrapparci alla coppia chiave / valore).
Di 'che abbiamo un Map
:
Map<String, String> m = new HashMap<String, String>();
m.put("Hello", "World");
m.put("Apple", "3.14");
m.put("Another", "Element");
Le chiavi come a List
possono essere ottenute creando una nuova ArrayList
da una Set
restituita dal Map.keySet
metodo:
List<String> list = new ArrayList<String>(m.keySet());
Mentre i valori come a List
possono essere ottenuti creando un nuovo ArrayList
da un Collection
restituito dal Map.values
metodo:
List<String> list = new ArrayList<String>(m.values());
Il risultato di ottenere i List
tasti:
Mela Un altro Ciao
Il risultato di ottenere i List
valori:
3.14 Elemento Mondo
HashMap
simili non ordinate Map
sarà effettivamente casuale.
Utilizzo dell'API Java 8 Streams.
List<Value> values = map.values().stream().collect(Collectors.toList());
map.entrySet()
ti dà una raccolta di Map.Entry
oggetti contenente sia la chiave che il valore. puoi quindi trasformarlo in qualsiasi oggetto di raccolta che ti piace, come ad esempio new ArrayList(map.entrySet())
;
un elenco di cosa?
Supponendo che map
sia la tua istanza diMap
map.values()
restituirà un Collection
contenente tutti i valori della mappa.map.keySet()
restituirà un Set
contenente tutte le chiavi della mappa.Immagino che tu voglia convertire i valori contenuti in Map
a list
? Il più semplice è chiamare il values()
metodo Map
dell'interfaccia. Questo restituirà il Collection
valore degli oggetti contenuti in Map
.
Si noti che questo Collection
è supportato Map
dall'oggetto e qualsiasi modifica Map
all'oggetto si rifletterà qui. Quindi, se si desidera una copia separata non associata al proprio Map
oggetto, è sufficiente creare un nuovo List
oggetto come ArrayList
passare un valore Collection
come di seguito.
ArrayList<String> list = new ArrayList<String>(map.values());
Puoi farlo in questo modo
List<Value> list = new ArrayList<Value>(map.values());
Se vuoi assicurarti che i valori nel risultante List<Value>
siano nell'ordinamento per chiave dell'input Map<Key, Value>
, devi "passare attraverso" in SortedMap
qualche modo.
O iniziare con una concreta SortedMap
implementazione (come TreeMap
) o inserire il vostro ingresso Map
in una SortedMap
prima della conversione che a List
. per esempio:
Map<Key,Value> map;
List<Value> list = new ArrayList<Value>( new TreeMap<Key Value>( map ));
Altrimenti otterrai qualsiasi ordinamento nativo Map
fornito dall'implementazione, che spesso può essere qualcosa di diverso dall'ordinamento chiave naturale (Try Hashtable
or ConcurrentHashMap
, per varietà).
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);
possiamo avere sia coppia chiave che valore nell'elenco. Inoltre possiamo ottenere chiave e valore usando Map.Entry ripetendo l'elenco.
// 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());
} "
Ecco il metodo generico per ottenere valori dalla mappa.
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());
}