【问题标题】:why do we use entrySet() method and use the returned set to iterate a map?为什么我们使用 entrySet() 方法并使用返回的集合来迭代地图?
【发布时间】:2011-07-22 16:23:03
【问题描述】:

通常我们写这个是为了从映射中获取键和值。

Map m=new HashMap();
Set s=map.entrySet();
Iterator i=s.iterator()
while(s.hasNext()){
    Map.Entry m= (map.Entry) s.next();
    System.out.println(""+m.getKey()+""+ m.getValue());
}

为什么我们使用集合进行迭代为什么不直接映射?

【问题讨论】:

    标签: java dictionary collections iterator


    【解决方案1】:

    这与我们尽可能地迭代映射很接近,因为您必须说明是只需要键、值还是整个键/值条目。对于 Sets 和 Lists,只有一个选项,因此不需要单独的方法来执行此操作。

    顺便说一句:这就是我迭代 Map 的方式。请注意泛型、for-each 循环和 LinkedHashMap 的使用,因此条目以某种逻辑顺序出现。 TreeMap 将是另一个不错的选择。

    Map<K,V> m=new LinkedHashMap<K,V>();
    for(Map.Entry<K,V> entry: m.entrySet())
        System.out.println(entry.getKey() + ": " + entry.getValue());
    

    在 Java 8 中你可以编写

    m.forEach((k, v) -> System.out.println(k + ": " + v));
    

    【讨论】:

    • 所以不需要迭代器?
    • @Jwan622 for-each 循环是在 Java 5.0 (2004) 中添加的,它将为您管理迭代器。对于集合,仍然有一个迭代器,但您不需要直接使用它(除非您想删除条目)
    • 啊,所以在幕后有一个迭代器......明白了。所以一般来说我们获取map对象,在它上面调用entrySet把它变成一个set对象,然后我们通过把set对象切片到Map.Entry的里面来迭代这个set对象?怎么说呢?
    【解决方案2】:

    因为,从逻辑上讲,映射是键值对的集合集合——这就是 Map.Entry 所代表的。迭代通常是对集合的操作,而不是专门针对地图的操作。

    但是,我经常想知道为什么 Map 不实现 Iterable&lt;Map.Entry&lt;K,V&gt;&gt; 等并直接在映射条目上提供 iterator() 方法而不是需要条目集(它当然也可以这样做)提供完整的Set API。

    【讨论】:

      【解决方案3】:

      Map 是成对事物的集合,没错(Entries)。因此,您可以迭代条目,或仅迭代键 (map.keySet()),或仅迭代值 (map.values())。您还希望能够迭代什么?

      【讨论】:

        【解决方案4】:

        因为 Java 没有更好的语法来做到这一点。 (你的可以改进)

        这样就好了

        for(String key, Integer val : map)
            print(key, val);
        

        map.foreach (String key, Integer val) -> print(key, val);
        

        但 Java 没有这些。

        【讨论】:

        • 问题比语法更深。您不能使用旧式 for 循环或 while 循环来执行此操作。
        猜你喜欢
        • 2021-05-12
        • 1970-01-01
        • 2012-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-25
        • 1970-01-01
        • 2015-10-16
        相关资源
        最近更新 更多