Pergunta

Eu tenho uma classe MyMap que envolve o TreeMap.(Digamos que seja uma coleção de cachorros e que as chaves sejam barbantes).

public class MyMap {
   private TreeMap<String, Dog> map;
...
}

Eu gostaria de tornar o MyMap iterável com o loop for-each.Eu sei como teria feito isso se minha classe fosse um wrapper do LinkedList:

public class MyList implements Iterable<Dog> {
   private LinkedList<Dog> list;
   ...
   public Iterator<Dog> iterator() {
      return list.iterator();
   }
}

Mas tal solução não funciona para TreeMap porque TreeMap não possui um iterador().Então, como posso tornar o MyMap iterável?

E a mesma pergunta, exceto MyMap, envolve HashMap (em vez de TreeMap).

Obrigado.

Foi útil?

Solução

public Iterator<Dog> iterator() {
      return map.values().iterator();
}

Outras dicas

É porque você só pode iterar as chaves ou os valores de um mapa, não o próprio mapa

Normalmente você pode fazer isso:

for( Object value : mymap.values()  ){
  System.out.println(value);
}

Então, o que estou sugerindo é: seu mapa precisa ter um iterável? Não se você quiser apenas obter os valores ... ou as próprias chaves.

Além disso, considere usar as coleções de encaminhamento do Google, como ForwardingList

public class MyMap implements Iterable<Dog> {
   private TreeMap<String, Dog> map;
   ...
   @Override
   public Iterator<Dog> iterator() {
      return map.values().iterator();
   }
}

map.values() é uma visualização de coleção dos cães contidos no mapa.O iterador da coleção retornará os valores na ordem em que suas chaves correspondentes aparecem na árvore.Obrigado a Jonathan Feinberg.

Uma possibilidade pode ser definir um Entryset () Método que retorna um conjunto e depois itera sobre o conjunto.

Para a iteração para cada uma seria algo assim:

for (Map.Entry<String,Integer> m: someMap.entrySet()){
   System.out.println("Key="+m.getKey()+" value="+m.getValue());
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top