Map com for aprimorado

4 respostas
P

O seguinte codigo:

Map<String, Integer> map = new HashMap<String, Integer>();

for(Map mapa : map)
     //codigo

Não funciona com for aprimorado.
Este exemplo é do livro do Deitel pag.705, nele o autor converte o Map para um Set e depois para um TreeSet.

Set<String> keys = map.keySet();

TreeSet<String> sortedKeys = new TreeSet<String>(keys);

for( String key : sortedKeys ) // Assim o for funciona

Um Map não pode ser usado com o for aprimorado?

4 Respostas

B

Ola,

O for primorado somente funciona com classes que implementem Iterator, logo Map nao implementa.

Da uma olhada na api e veja quais classes implementam, e pode user usada no for.

L

E o código (primeiro) que vc postou tb não faz muito sentido, um Map contém vários Maps? hehe

Assim faz mais sentido e funciona:

Map<String, String> map = new HashMap<String, String>();
for (Entry<String, String> entry : map.entrySet()) {
  System.out.println(entry.getKey() + " - " + entry.getValue());
}

Ou seja, itera sobre os entries do Map

P


E o código (primeiro) que vc postou tb não faz muito sentido, um Map contém vários Maps? hehe
:sad:

O código que você coloco passa o map para um set, não é?Essa é a unica forma dele funcionar com o for?

L

É porque um Map é um Set de Entry, um Entry é um par de chave/valor, então se vc quiser iterar o map, vai ter que iterar sobre esses entries (ou sobre as chaves ou sobre os valores direto).
Se vc faz questão de usar o Map direto no for aprimorado, usa esse que nada mais é que uma extensão de HashMap tornando ele Iterable sobre seus Entries hehe

class MeuMap<K, V> extends HashMap<K, V> implements Iterable<Entry<K, V>> {
  public Iterator<Entry<K, V>> iterator() {
    return entrySet().iterator();
  }
}
Criado 7 de janeiro de 2008
Ultima resposta 8 de jan. de 2008
Respostas 4
Participantes 3