4

我有一个包装 TreeMap 的类 MyMap。(假设它是一组狗,并且键是字符串)。

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

我想用 for-each 循环将 MyMap 变成可迭代的。如果我的类是 LinkedList 包装器,我知道我会怎么做:

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

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

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

谢谢。

4

4 回答 4

8
public Iterator<Dog> iterator() {
      return map.values().iterator();
}
于 2010-01-12T19:24:00.400 回答
6

这是因为您只能迭代 Map 的键或值,而不是映射本身

通常你可以这样做:

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

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

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

于 2010-01-12T19:23:11.150 回答
4
public class MyMap implements Iterable<Dog> {
   private TreeMap<String, Dog> map;
   ...
   @Override
   public Iterator<Dog> iterator() {
      return map.values().iterator();
   }
}

map.values() 是地图中包含的狗的集合视图。集合的迭代器将按照它们对应的键出现在树中的顺序返回值。感谢乔纳森·范伯格。

于 2010-01-12T20:38:08.367 回答
1

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

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

for (Map.Entry<String,Integer> m: someMap.entrySet()){
   System.out.println("Key="+m.getKey()+" value="+m.getValue());
}
于 2010-01-12T19:34:03.423 回答