我正在创建一个将字符串映射到整数的类。我希望能够获得与特定String相关联的Integer并迭代这些条目,这些条目被定义为另一个实现Map.Entry<String, Integer>
的类。
目前我有这个:
public class MyMap implements Iterable<MyEntry> {
private final Map<String, Integer> wrappedMap =
new HashMap<String, Integer>();
@Override
public Iterator<MyEntry> iterator() {
return wrappedMap.entrySet().iterator();
}
//more methods
}
即使MyEntry实现Map.Entry<String, Integer>
,也不会因为类型不匹配而进行编译。
有没有办法制作Map.Entry的自定义实现?有一种更简单的方法可以做到这一点,我忽略了吗?先谢谢!
答案 0 :(得分:2)
它没有编译,因为MyEntry根本不是hashmap的一部分。如果要返回MyEntry列表,则需要将数据元素复制到MyEntry实例中并将其加载到集合中。这将是缓慢的,并消耗相当多的内存。
应该是:
@Override
public Iterator<Map.Entry<String,Integer>> iterator() {
return wrappedMap.entrySet().iterator();
}
对entrySet()
的调用返回一个Set,其中包含hashmap中的映射。因此迭代器需要迭代Entry
个对象
答案 1 :(得分:2)
为什么不只使用普通地图?
Map<String, MyEntry> map = new HashMap<String, MyEntry>();
然后你的迭代器就是这样:
Iterator<MyEntry> iter = map.values().iterator();
答案 2 :(得分:1)
尽管MyEntry
实现了Map.Entry<K,V>
,但Iterator<MyEntry>
实现Iterator<Map.Entry<K,V>>
并非如此。对于像Iterator
这样的类,这种区别对人类没有直观意义,所以让我们想到一个Box<E>
类,它有.put(E)
和.contains(E)
方法。 Box<Dinosaur>
是Box<Animal>
的子类吗?您可能会这么认为,但事实并非如此:在Box<Animal>
中调用.put(someMammal)
是合法的,但在Box<Dinosaur>
中显然是非法的。由于Box<Dinosaur>
无法支持Box<Animal>
上合法的所有操作,因此它绝对不是子类,不能随意替换。
从编译器的角度来看,同样的问题可能适用于迭代器,因此你不能重载.iterator()
来返回一个不是Iterator<K,V>
实例的对象。