我有一个包含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)。
感谢。
答案 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());
}