【问题标题】:Why is Set at all required when we have Maps?当我们有地图时,为什么需要设置?
【发布时间】:2014-05-02 01:22:53
【问题描述】:

从存在的角度来看,集合本质上是地图。我认为,没有什么是 Map 不能做的,而 Set 可以。我们有这些在 Maps 中定义键值对的开销,而 Sets 中没有这些开销。但同样,Set 的元素只是底层 Map 的键,对吧?那么当 Maps 能够完成所有需要的事情时,使用 Set 有什么意义呢?我希望 Set 占用与 Map 相同的内存量?

支持 Set 存在的关键论据是什么?

例如,在列表的情况下,我们有 ArrayList 和 LinkedList,它们有区别,我们可以根据自己的要求在这两者之间进行选择。

【问题讨论】:

  • 集合不需要键入

标签: java collections map set


【解决方案1】:

我认为Map 实际上是Set!

Map<Key,Value>可以用Set<Entry<Key,Value>>实现

这类似于集合、映射和函数的数学基础。

首先,我们能否同意Map 是来自Key=>Value(或Domain=>Range)的函数。每个键最多对应一个值,因此它是一个部分函数(或仅在映射中的这些键上的完整函数)。所以地图是一个函数。 (Scala 甚至让Map 实现了 Function1 接口。)

其次,什么是函数? A function is a set of tuples where each first element occurs only once in the set。元组的第二个元素是函数返回的值。

所以我们有Map is a Function is a Set。


实际上,拥有Sets 有很好的理由。从概念的角度来看,它们通常是正确的数据结构,甚至在您开始担心性能之前。在大多数情况下,我会在 List 上使用它们。

【讨论】:

  • 一切都是一个集合。猫列表是一组 <Integer,Cat> 对,其限制是,如果 X 显示为整数而不是 0,则 X-1 也会出现。我想这是建设性的集合论,但我可能错了。
  • 许多语言根本不实现列表,而是使用associative arrays,将列表实现为您描述的映射。由于地图是集合,我们现在应该引用 Led Zeppelin When all are one and one is all
  • 为了将Set<Entry<TKey,Tvalue>>用作Map<TKey,TValue>,必须有一个查询,给定一个Entry<TKey,TValue>,它报告自己相当于集合中的一个,将返回对存储在集合中的那种类型的实例。尽管在很多情况下,即使键除了键对象本身(例如实习表)之外没有“值”,这样的东西也会很有用,但Set 接口中没有提供这样的功能。
【解决方案2】:

Set 和 Map 之间的主要区别在于 Map 每个条目包含两个对象,例如键和值,它可能包含重复的值,但键始终是唯一的。但是 Set 只保存键,并且它们是唯一的。

【讨论】:

  • 从他的问题中,我们可以看出他已经知道了。他问为什么要使用 Set 数据结构开始,当我们已经有了 Maps 时,那只是类固醇上的集合。
猜你喜欢
  • 2021-05-23
  • 2023-01-24
  • 2011-07-12
  • 2021-11-05
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多