为HashMap创建自定义迭代器

4

I am trying to implement an iterator that will iterate through the HashMap and its duplicates. For example

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

然而,使用我的迭代器,我只能迭代两次,一次是"value"为"a"的位置,另一次是"value"为"b"的位置。我想创建一个迭代器,在整个Map中迭代4次。

编辑:我省略了很多细节,因为我只想看看是否可能有此迭代器,但我正在编写的代码实际上是Map的抽象。例如,我有一个add函数,它需要参数T。因此,添加字符串会像add("Hello")这样,这将使其键为"String",值为1。如果我再次调用add("Hello"),它的值将增加到2。如果我再次添加它,它的值将增加到3,依此类推。我想创建一个迭代器,它将遍历我添加的所有内容。

3个回答

4

很遗憾,Java的 Map接口不允许有重复的键:

一个将键映射到值的对象。地图不能包含重复的键;每个键最多只能映射到一个值。

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

如果您想保留重复的键(例如,“a”指向1和2),则可以使用列表或集合的Map,例如

Map<String, List<Integer>> myMap;

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

或者使用来自 GoogleApache 的 MultiMap。


针对您的问题,我认为您是想要一个特殊的地图,其中:
  1. 每个键的值都是该键输入的次数。
  2. 当您遍历地图时,您会遍历所有添加的键,每次它们被添加。
您可能需要查看他们如何实现HashMapiterator(),特别是查看内部私有类HashIteratornext()hasNext()可以保持返回键的次数(即如果"Hello"映射到2,则您的自定义iterator()将在移动到下一个键之前两次使用next()返回"Hello")。

可能地图并不是您尝试做的事情所适合使用的结构,但祝您好运!


是的,你明白了,那就是我试图迭代的内容。我已经成功将Map复制到ArrayList中,并放入相应键值的数量。然而,这并不是很高效。 - Isai

3
你可以尝试使用guava库中的Multimapjava.util.HashMap只允许将一个值与一个键关联起来。

0
你可以通过以下方式访问HashMap的迭代器:

myHashMap.entrySet.iterator()

如果您想循环遍历所有对象,这是更快的方法:
for(Object o : myHashMap.entrySet()) {
     // do something with o
}

在你的情况下,问题似乎是因为Java中的HashMap不能具有相同的键,因此你的代码只向HashMap添加了两个对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接