0

我正在制作一个将字符串映射到整数的类。我希望能够获取与特定 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 的实现?有没有更简单的方法可以做到这一点,我忽略了?提前致谢!

4

3 回答 3

2

它没有编译,因为 MyEntry 根本不是哈希图的一部分。如果要返回 MyEntry 列表,则需要将数据元素复制到 MyEntry 实例中并将其加载到集合中。这会很慢并且会消耗大量内存。

它应该是:

@Override
public Iterator<Map.Entry<String,Integer>> iterator() {
    return wrappedMap.entrySet().iterator();
}

调用entrySet()返回一个 Set,其中包含 hashmap 中的映射。所以迭代器需要遍历Entry对象

于 2013-01-23T02:23:10.167 回答
2

为什么不只使用常规地图?

Map<String, MyEntry> map = new HashMap<String, MyEntry>();

然后你的迭代器将是这样的:

Iterator<MyEntry> iter = map.values().iterator();
于 2013-01-23T02:31:58.933 回答
1

即使MyEntryimplements Map.Entry<K,V>,也不是Iterator<MyEntry>implements Iterator<Map.Entry<K,V>>。对于像这样的类Iterator,这种区别对人类来说没有直观的意义,所以让我们考虑一个Box<E>类,它有.put(E).contains(E)方法。是Box<Dinosaur>的子类Box<Animal>吗?您可能会这么认为,但事实并非如此:在 aBox<Animal>中调用 是合法的.put(someMammal),但在 aBox<Dinosaur>中显然是非法的。由于Box<Dinosaur>不能支持 a 上所有合法的动作Box<Animal>,所以它绝对不是子类,不能随意替换。

从编译器的角度来看,同样的问题可能适用于迭代器,因此您不能重载.iterator()以返回不是Iterator<K,V>.

于 2013-01-23T02:22:33.733 回答