【问题标题】:Ruby Hash with duplicate keys?带有重复键的Ruby Hash?
【发布时间】:2011-10-12 03:14:53
【问题描述】:

是否可以在 Ruby 中创建允许重复键的哈希?

我正在使用 Ruby 1.9.2。

【问题讨论】:

  • 简短的回答是否定的,哈希需要有唯一的键。为什么你需要一个带有重复键的哈希?
  • 您的意思是Hash 类的一个实例,它有两个条目,每个条目都有相同的精确键?
  • 你不想要这个,你需要破坏性能才能允许这个。
  • @Thiago,这是一种中等的答案。简短的回答是“不”:)
  • 或许阅读the documentation 会有所帮助:“哈希是一个类似于字典的唯一键及其值的集合。”

标签: ruby hash key


【解决方案1】:

这有点违背哈希的目的,不是吗?

如果你想让一个键指向多个元素,让它指向一个数组:

h = Hash.new { |h,k| h[k] = [] }
h[:foo] << :bar
h #=> {:foo=>[:bar]}
h[:foo] << :baz
h #=> {:foo=>[:bar, :baz]}

【讨论】:

  • 这实际上取决于上下文。例如,在 LDAP 系统中,您可以有多个 objectClass,是的,您可以定义一个像这样的哈希:attrs = { ..., displayName: user.short_name, objectClass: "organizationPerson", objectClass: "person", objectClass: "top", objectClass: "user", i }
  • 很可能是这样,但这并没有将它变成一个关联数组(这就是 Ruby 哈希值)。 “在计算机科学中,关联数组、映射、符号表或字典是由(键、值)对的集合组成的抽象数据类型,因此 每个可能的键在集合中只出现一次。”添加了重点。
  • C++ 具有允许多个具有相同名称的键的多重映射和多重集。来自关联数组的同一个维基百科页面:“多重映射通过允许多个值与单个键关联来概括关联数组。”所以我不会说它违背了目的......但它只是一个不同的、有效的用例。
  • 当然,但是如果您查看 multimap 的 C++ 模板,您还会发现它是一个比简单的关联数组(即 Ruby 哈希值)更复杂的数据结构。 Ruby 有 multimap gems,例如github.com/doxavore/multimap.
【解决方案2】:

在哈希中实现重复键的两种方法:

h1 = {}
h1.compare_by_identity
h1["a"] = 1
h1["a"] = 2
p h1 # => {"a"=>1, "a"=>2}


h2 = {}
a1 = [1,2,3]
a2 = [1,2]
h2[a1] = 1
h2[a2] = 2
a2 << 3 
p h2 # => {[1, 2, 3]=>1, [1, 2, 3]=>2}

【讨论】:

  • 第一个例子正是我想要的。太棒了。
  • 你好 Steenslag,我使用“compare_by_identity”创建具有重复键的哈希。但它不起作用。请你帮帮我。
  • @Buddy 你用什么做钥匙?整数和符号不起作用,只有一个 1 和一个 :a - 重复是不可能的。 compare_by_identity 通过比较 object_id 来工作,普通哈希通过比较 eql? 方法的结果进行比较。
  • 奇怪......它在 2.3.3 上不起作用,但它在 2.4.2 上起作用?!
  • 我们在我的公司遇到了类似的问题,我的老板想出了一个解决方案,让第一个示例在所有 ruby​​ 版本中都能工作。基本上在一些红宝石(最新?)中,当你写两次h1['a'] 时,a 字符串对象会被创建为不同的 id。在其他版本中不是这种情况。在其他版本中,当您写两次h1['a'] 时,该“a”的 id 每次都会相同。一种解决方法是使用h1['a'.clone] 创建一个新的字符串对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 2014-10-13
相关资源
最近更新 更多