自定义地图输入集 - 是否可能?

时间:2013-01-23 02:12:18

标签: java dictionary

我正在创建一个将字符串映射到整数的类。我希望能够获得与特定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的自定义实现?有一种更简单的方法可以做到这一点,我忽略了吗?先谢谢!

3 个答案:

答案 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>实例的对象。