【问题标题】:Why can't we use Iterator on a Map(Java)?为什么我们不能在 Map(Java) 上使用迭代器?
【发布时间】:2012-07-16 15:45:52
【问题描述】:

我知道要遍历Map,我需要使用entrySet() 方法,然后在生成的Set 上使用Iterator。我觉得这个问题可能很愚蠢,但是,Map 究竟是如何实现的,因此不可能直接在其上使用Iterator?据我了解,Map 不是集合,Iterator 旨在用于集合。但从逻辑上讲,Map 不也是键值对的集合吗(虽然它没有实现Collection 接口)?

【问题讨论】:

标签: java


【解决方案1】:

AFAIK,您不能直接迭代 Map,因为 Map 支持三种类型的迭代,并且没有明确的理由选择其中一种。执行等效的entrySet().iterator() 可能是合理的,但这不是做出的选择。

【讨论】:

    【解决方案2】:

    您要迭代条目(键+值)还是仅迭代键或仅迭代值?这就是您获取特定集合并获取迭代器的原因。

    由于键/条目是唯一的(不存在重复元素),您可以通过entrySet()keySet() 获得一个集合。并且由于值可以有重复,您通过values() 获取集合,然后从中获取迭代器。

    【讨论】:

    • 像在 C++ STL 中那样在映射上实现迭代会有什么问题:一个迭代器指向一个 std::pair,然后你选择 firstsecond 根据您的需要?
    【解决方案3】:

    Collection 实现了 Iterator,Map 虽然不属于java.util.Collection,但仍然在 Collection 框架中考虑。

    这是我用来迭代地图的方法

    for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
        System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
    }
    

    【讨论】:

      【解决方案4】:

      这取决于程序员寻求迭代的价值。要么只是键或值,要么两者兼而有之。基于此,我们可以迭代三个不同的对象。示例:mapObject.keySet().iterator();或mapObject.values().iterator();或mapObject.entrySet().iterator()。唯一要记住的是,当我们仅迭代 values() 集合时,我们不会以任何方式获得相应的密钥。

      【讨论】:

        猜你喜欢
        • 2011-02-05
        • 2013-04-06
        • 2017-01-30
        • 2017-09-24
        • 2016-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多