为什么java.util.Map.values()允许您从返回的Collection中删除条目

时间:2011-09-13 20:54:15

标签: java

为什么java.util.Map.values()允许您从返回的Collection中删除条目,因为根据值删除键值对是没有意义的?执行此操作的代码将不知道要删除的值(以及因此的键)是从哪个键映射的。特别是当存在重复值时,在该C​​ollection上调用remove将导致删除意外的密钥。

4 个答案:

答案 0 :(得分:6)

  

根据值

删除键值对是没有意义的

我认为你没有足够的想象力。我承认可能没有使用 wide ,但是会有一些有用的情况。

作为示例用例,假设您有一个名为Map<Person, TelephoneNumber>的{​​{1}}。现在,您希望按本地搜索联系人列表进行过滤。

要完成此操作,您可以复制地图contactList并删除localContacts = new HashMap<>(contactList)以区域代码而非本地区号开头的所有映射。这将是您想要遍历TelephoneNumber集合并删除一些值的有效时间:

values
  

特别是当存在重复值时,在该C​​ollection上调用remove会导致删除意外的键。

如果要删除具有该值的所有映射,该怎么办?

答案 1 :(得分:6)

它必须有remove方法,因为它是Collection的一部分。鉴于此,它可以选择允许您删除值或抛出UnsupportedOperationException。由于您可能想要删除值的合理原因,为什么不选择允许此操作?

  • 也许你想删除每个实例都有一个给定的值 来自Map
  • 也许你想减少每三分之一 键/值对由于某种原因。
  • 也许你有酒店的地图 房间号码占用计数,你想删除一切 占用计数大于1的地图 为某人留下一个房间。
  • ...如果你想的更多 密切关注,还有更多这样的例子......

简而言之:在很多情况下这可能会有用,实施它不会伤害任何不使用它的人,为什么不呢?

答案 2 :(得分:0)

返回的Collection是一个特殊的Collection,它的语义使得它知道它中的值如何与它所来自的Map相关。 javadoc表示返回的集合支持的Collection操作。

答案 3 :(得分:0)

我认为基于密钥删除值通常是有用的;其他答案显示例子。鉴于此,如果您想删除某个值,为什么您只想删除它的一个特定键?即使你这样做了,你也必须知道你要删除哪个密钥(视情况而定),然后你应该通过密钥将其删除。