如何为TreeMap和HashMap(Java)创建可迭代包装器?

时间:2010-01-12 19:20:52

标签: java iterator hashmap treemap iterable

我有一个包含TreeMap的MyMap类。 (说它是狗的集合,键是字符串)。

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

我想将forMap与for-each循环一起迭代。我知道如果我的类是LinkedList包装器我会怎么做:

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

但是这样的解决方案不适用于TreeMap,因为TreeMap没有迭代器()。那么如何才能使MyMap可迭代?

除了MyMap之外,同样的问题包含了HashMap(而不是TreeMap)。

感谢。

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:6)

这是因为你只能迭代地图的键或值,而不是地图本身

通常你可以这样做:

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

所以,我建议的是:你的Map需要有一个可迭代的吗?如果您只想获得价值......或者密钥本身,那就不是了。

另外,请考虑使用Google的转发集合,例如ForwardingList

答案 2 :(得分:4)

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

map.values()是地图中包含的狗的集合视图。集合的迭代器将按照其对应键出现在树中的顺序返回值。 感谢Jonathan Feinberg。

答案 3 :(得分:1)

一种可能性是定义一个entrySet()方法,该方法返回一个Set,然后迭代Set。

For-each迭代看起来像这样:

for (Map.Entry<String,Integer> m: someMap.entrySet()){
   System.out.println("Key="+m.getKey()+" value="+m.getValue());
}