我正在尝试实现一个遍历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等等。我想创建一个迭代器来迭代我添加的所有东西。答案 0 :(得分:4)
不幸的是,Java的Map接口不允许重复键:
将键映射到值的对象。一个 map不能包含重复键; 每个键最多可以映射一个值。
因此,当您尝试放置已存在于地图中的键时,新值将替换旧值;你的迭代器迭代2次的原因是因为只有2个项目。
如果你想保留重复的密钥(比如“a”指向1和2),你可以拥有列表或集合的地图,比如
Map<String, List<Integer>> myMap;
如果某个键映射到的列表或集包含所有值,例如myMap.get("a")
,则会返回一个类似于[1,2]
的列表。
对于你的问题,我相信你说你想要一个特殊的地图:
您可能希望了解他们如何为HashMap实施iterator()
,特别是查看内部私有类HashIterator
。
next()
和hasNext()
可能会继续按键指定的次数返回密钥(即如果"Hello"
映射到2
,则自定义迭代器()在移动到下一个键之前,将返回next()
“Hello”两次。
地图可能不适合用于你想要做的事情,但我祝你好运!
答案 1 :(得分:3)
您可以尝试使用guava库中的Multimap。 java.util.HashMap
允许仅将一个值与一个键相关联。
答案 2 :(得分:0)
您可以像这样访问HashMap的Iterator:
myHashMap.entrySet.iterator()
如果您想循环所有对象,这是一种更快捷的方式:
for(Object o : myHashMap.entrySet()) {
// do something with o
}
您的案例中的问题似乎来自于Java中的HashMap不能具有相同的键,因此您的代码只向HashMap添加两个对象。