Iterar através de um HashMap [duplicado]
Qual é a melhor maneira de iterar os itens de um...?possível duplicado:
como iterar eficientemente cada entrada em um'mapa'?
7 answers
Iterate através do entrySet()
assim:
public static void printMap(Map mp) {
Iterator it = mp.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
System.out.println(pair.getKey() + " = " + pair.getValue());
it.remove(); // avoids a ConcurrentModificationException
}
}
Leia mais sobre Map
.
keySet()
do mapa:
Map<String, Object> map = ...;
for (String key : map.keySet()) {
// ...
}
Se só necessita dos valores, use values()
:
for (Object value : map.values()) {
// ...
}
Finalmente, se quiser tanto a chave como o valor, use entrySet()
:
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
// ...
}
Uma advertência: Se quiser remover itens a meio da iteração, terá de o fazer através de um iterador (ver a resposta do karim79). No entanto, mudar os valores dos itens está OK (ver Map.Entry
).
Extraído da referência Como Iterar Sobre um Mapa em Java:
Existem várias formas de iterar sobre um Map
em Java. Vamos rever os métodos mais comuns e rever as suas vantagens e desvantagens. Uma vez que todos os mapas em Java implementam a interface do mapa, as seguintes técnicas trabalharão para qualquer implementação do mapa(HashMap
, TreeMap
, LinkedHashMap
, Hashtable
, etc.)
Método #1 : iteração por itens usando um para-cada loop.
Este é o método mais comum e é preferível na maioria dos casos. Ele deve ser usado se você precisar de chaves de mapa e valores no loop.
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
Note que o loop para cada loop foi introduzido em Java 5, de modo que este método está funcionando apenas em versões mais recentes da linguagem. Também um para-cada ciclo irá lançar NullPointerException
Se você tentar iterar sobre um mapa que é nulo, então antes de iterar você deve sempre verificar as referências nulas.
Método # 2 : iteração por teclas ou valores usando um para-cada laço.
Se necessitar apenas de chaves ou valores do mapa, poderá iterar sobre o conjunto de chaves ou valores em vez do conjunto de entradas.
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
// Iterating over keys only
for (Integer key : map.keySet()) {
System.out.println("Key = " + key);
}
// Iterating over values only
for (Integer value : map.values()) {
System.out.println("Value = " + value);
}
Este método dá uma ligeira vantagem de desempenho sobre entrySet
iteração (cerca de 10% mais rápida) e é mais limpo.
Método # 3 : Iterating using Iterator.
Usando Genéricos:
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<Integer, Integer> entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
Sem Genéricos:
Map map = new HashMap();
Iterator entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
Integer key = (Integer)entry.getKey();
Integer value = (Integer)entry.getValue();
System.out.println("Key = " + key + ", Value = " + value);
}
Também pode usar a mesma técnica para iterar keySet
ou valores.
iterator.remove()
. Se você tentar fazer isso durante-cada iteração você terá "resultados imprevisíveis" de acordo com Javadoc .
De um ponto de vista de desempenho, este método é igual a uma por cada iteração.
Método # 4 : iterar as teclas e procurar valores (ineficiente).
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Integer key : map.keySet()) {
Integer value = map.get(key);
System.out.println("Key = " + key + ", Value = " + value);
}
Isto pode parecer uma alternativa mais limpa para o método #1, mas na prática é muito lento e ineficiente, uma vez que obter valores por uma chave pode ser demorado (este método em diferentes implementações de mapas é 20% -200% mais lento do que o método #1). Se você tem FindBugs instalados, ele vai detectar isso e avisá-lo sobre iteração ineficiente. Este método deve ser evitar.
Conclusão:
Se só precisar de chaves ou valores do mapa, use o método #2. Se você está preso com a versão mais antiga de Java (menos de 5) ou planejando remover itens durante a iteração, você tem que usar o método #3. Caso contrário, utilizar o método # 1.
for (Map.Entry<String, String> item : params.entrySet()) {
String key = item.getKey();
String value = item.getValue();
}
Você pode iterar através das entradas em um Map
de várias maneiras. Obter cada chave e valor assim:
Map<?,?> map = new HashMap<Object, Object>();
for(Entry<?, ?> e: map.entrySet()){
System.out.println("Key " + e.getKey());
System.out.println("Value " + e.getValue());
}
Ou podes obter a lista de chaves com
Collection<?> keys = map.keySet();
for(Object key: keys){
System.out.println("Key " + key);
System.out.println("Value " + map.get(key));
}
Se você só quer obter todos os valores e não está preocupado com as chaves, você pode usar:
Collection<?> values = map.values();
Mais Inteligente:
for (String key : hashMap.keySet()) {
System.out.println("Key: " + key + ", Value: " + map.get(key));
}
values()
. E se você só precisa das chaves, então use keyset()
.
Uma má prática seria iterar através de todas as chaves, e então dentro do loop, sempre fazer {[[3]} para obter o valor. Se estás a fazer isso, a primeira opção que escrevi é para ti.