【问题标题】:How can each element in Set be a Map.Entry object?Set 中的每个元素如何成为 Map.Entry 对象?
【发布时间】:2014-02-15 09:05:49
【问题描述】:

我有点困惑。我在看地图界面。它必须使用 entrySet() 方法让集合视图使用迭代器。 entrySet() 返回一个包含 map 元素的 Set。同样,每个 Set 元素都是一个 Map.Entry 对象。这怎么可能? as Set 只包含一个字段,而 Map.Entry 是键值对?

【问题讨论】:

  • 一个集合只包含一个字段?你是什​​么意思。一个 Set 是......一组元素。集合的每个元素都是一个映射条目。每个地图条目都有一个键和一个值。对我来说听起来很合乎逻辑。
  • 不清楚这里的误会是什么。 Set 包含(引用)对象,在这种情况下,对象恰好是 Map.Entry 类型。
  • 所以,它类似于- Set> 设置?
  • 是的。只是它们的元素是Map.Entry 类型。这里没有神秘;)

标签: java


【解决方案1】:

映射基本上是一组key => value 映射。此外,键是唯一的,值不必是唯一的。键值对封装在 Map.Entry 对象中。当您遍历映射的条目(= 键值对集)时,对于每个 entry,您可以使用 entry.getKey() 获取键和 entry.getValue() 的值。

除了条目集之外,映射还提供键集和值集合。例如,在Map<String, Date> 中,键值对集为Set<Map.Entry<String, Date>>,键集为Set<String>,值集合为Collection<Date>

遍历条目的具体示例:

Map<String, Date> map = new HashMap<String, Date>();
map.put("now", new Date());
map.put("now+", new Date());
for (Map.Entry<String, Date> entry : map.entrySet()) {
    String key = entry.getKey();
    Date value = entry.getValue();
    System.out.println(String.format("%s => %s", key, value));
}

另一种迭代方式是按键:

for (String key : map.keySet()) {
    Date value = map.get(key);
    System.out.println(String.format("%s => %s", key, value));
}

但这效率较低,因为与使用直接访问值的条目相比,您必须对每个键执行查找以获取值。

【讨论】:

    【解决方案2】:

    Set 元素是对象,Map.Entry 实例也是对象。都正确。

    【讨论】:

      【解决方案3】:

      考虑以下几点:您可以使用您喜欢的任何属性创建自己的Cat 类。例如:

      public class Cat {
          private String name;
          private String type;
          private boolean isGrumpy;
          // etc...
      }
      

      只要你实现了equals(Object)hashCode(),这个类的实例就可以放在Set中,对吧?

      那么为什么Map.Entry 应该不同呢?把它想象成一个有两个成员的类 - keyvalue

      【讨论】:

        猜你喜欢
        • 2020-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-16
        相关资源
        最近更新 更多