Iterar através de um HashMap [duplicado]

possível duplicado:
como iterar eficientemente cada entrada em um'mapa'?

Qual é a melhor maneira de iterar os itens de um...?

Author: Peter Mortensen, 2009-07-01

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.

 2884
Author: karim79, 2018-04-20 16:56:35
Se só estás interessado nas chaves, podes passar pelo ... 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).

 4194
Author: harto, 2017-05-23 12:34:51

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.

Este método pode parecer redundante, mas tem as suas próprias vantagens. Em primeiro lugar, é a única maneira de iterar sobre um mapa em versões mais antigas do Java. A outra característica importante é que é o único método que lhe permite remover entradas do mapa durante a iteração, chamando 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.

 751
Author: arvind, 2016-07-06 19:33:03
for (Map.Entry<String, String> item : params.entrySet()) {
    String key = item.getKey();
    String value = item.getValue();
}
 84
Author: gabor, 2018-04-20 16:52:35

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();
 82
Author: codethulhu, 2018-04-20 16:52:15

Mais Inteligente:

for (String key : hashMap.keySet()) {
    System.out.println("Key: " + key + ", Value: " + map.get(key));
}
 57
Author: jkarretero, 2010-08-11 10:01:04
Depende. Se você sabe que vai precisar tanto da chave quanto do valor de cada entrada, então vá através do {[[0]}. Se você só precisa dos valores, então há o método 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.

 42
Author: Gary Kephart, 2013-09-27 17:42:25