为HashMap创建自定义迭代器

时间:2011-03-05 16:37:49

标签: java collections iterator hashmap

我正在尝试实现一个遍历HashMap及其重复项的迭代器。例如

string.put("a", 1);
string.put("a", 2);
string.put("b", 3);
string.put("b", 4);

然而,对于我的迭代器,我只迭代两次,一次是值“a”,另一次是“b”。我想制作一个在整个Map中迭代4次的迭代器。

编辑:我遗漏了很多细节,因为我只是想看看这个迭代器是否可行,但我写的代码实际上是地图的抽象。例如,我有一个add函数,它接受参数T.因此,为了添加一个字符串,它看起来像add(“Hello”)。通过添加此字符串,它的键是“String”,其值为1.如果我再次调用add(“Hello”),它会将值提升为2.如果我再次添加它,它会将其值提高到3等等。我想创建一个迭代器来迭代我添加的所有东西。

3 个答案:

答案 0 :(得分:4)

不幸的是,Java的Map接口不允许重复键:

  

将键映射到值的对象。一个   map不能包含重复键;   每个键最多可以映射一个值。

因此,当您尝试放置已存在于地图中的键时,新值将替换旧值;你的迭代器迭代2次的原因是因为只有2个项目。

如果你想保留重复的密钥(比如“a”指向1和2),你可以拥有列表或集合的地图,比如

Map<String, List<Integer>> myMap;

如果某个键映射到的列表或集包含所有值,例如myMap.get("a"),则会返回一个类似于[1,2]的列表。

或者使用GoogleApache

中的MultiMap之类的内容

对于你的问题,我相信你说你想要一个特殊的地图:

  1. 每个键的值是键输入的次数。
  2. 当您遍历地图时,您会在每次添加时迭代所添加的所有键。
  3. 您可能希望了解他们如何为HashMap实施iterator(),特别是查看内部私有类HashIterator

    next()hasNext()可能会继续按键指定的次数返回密钥(即如果"Hello"映射到2,则自定义迭代器()在移动到下一个键之前,将返回next()“Hello”两次。

    地图可能不适合用于你想要做的事情,但我祝你好运!

答案 1 :(得分:3)

您可以尝试使用guava库中的Multimapjava.util.HashMap允许仅将一个值与一个键相关联。

答案 2 :(得分:0)

您可以像这样访问HashMap的Iterator:

myHashMap.entrySet.iterator()

如果您想循环所有对象,这是一种更快捷的方式:

for(Object o : myHashMap.entrySet()) {
     // do something with o
}

您的案例中的问题似乎来自于Java中的HashMap不能具有相同的键,因此您的代码只向HashMap添加两个对象。