【问题标题】:Creating a custom iterator for a HashMap为 HashMap 创建自定义迭代器
【发布时间】:2011-07-09 11:22:46
【问题描述】:

我正在尝试实现一个迭代器,它将遍历 HashMap 及其副本。例如

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

但是,我的迭代器只迭代两次,一次用于值为“a”,另一次用于“b”。我想做一个迭代器,它会在整个地图中迭代 4 次。

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

【问题讨论】:

    标签: java collections iterator hashmap


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      如果你想保留重复的键(比如“a”指向 1 和 2),你可以有一个 List 或 Set 的 Map,比如

      Map<String, List<Integer>> myMap;
      

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

      或者使用来自 GoogleApache 的 MultiMap 之类的东西


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

      1. 每个键的值是该键被输入的次数。
      2. 迭代地图时,每次添加的键都会迭代。

      您可能想看看他们如何为HashMap 实现iterator(),特别是查看内部私有类HashIterator

      next()hasNext() 可能会一直返回键值指定的次数(即如果 "Hello" 映射到 2,您的自定义迭代器()将返回 next()“Hello " 两次,然后移到下一个键)。

      地图可能不适合用于您正在尝试做的事情,但祝您好运!

      【讨论】:

      • 是的,你明白了,这就是我要迭代的内容。我让它工作,我将映射复制到一个数组列表并放入键,无论它的值是多少倍。但是,这不是很有效。
      【解决方案3】:

      您可以像这样访问 HashMap 的迭代器:

      myHashMap.entrySet.iterator()
      

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

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

      您的问题似乎来自 java 中的 HashMap 不能具有相同键的事实,因此您的代码仅向 HashMap 添加了两个对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-23
        • 1970-01-01
        • 1970-01-01
        • 2020-09-27
        • 2023-01-10
        • 2018-04-14
        相关资源
        最近更新 更多