-1

我做了两个哈希hash1,并hash2使用了以下键和值。

输入:

hash1 = {1=>"One", 2=>"Two", 3=>"Three"}
hash2 = {4=>"First", 5=>"Second", 6=>"Third"}

结果:

我期待hash3给我一个像

hash3 #=> {1 => "One", 2 => "Two", 3 => "Three", 4 => "First", 5 => "Second", 6 => "Third"}

谁能告诉我如何合并这两个哈希?假设hash3应该包含所有键和所有值。

4

4 回答 4

5

最少编码的解决方案

hash3 = hash1.merge(hash2)
于 2013-07-07T16:47:20.160 回答
5

看来您正在寻找Hash#merge

hash1 = {1=>"One", 2=>"Two", 3=>"Three"}
hash2 = {4=>"First", 5=>"Second", 6=>"Third"}
hash3 = hash1.merge hash2
#=> {1 => "One", 2 => "Two", 3 => "Three", 4 => "First", 5 => "Second", 6 => "Third"}

考虑到您通过递增的整数序列访问散列这一事实,您应该考虑使用数组而不是散列。

result = hash1.values + hash2.values
# => ["One", "Two", "Three", "First", "Second", "Third"]

这样,您仍然可以类似地访问您的值(例如result[2] #=> "Three"),但您有一个更简洁的数据结构。

于 2013-07-06T19:37:08.107 回答
3

如果您希望 1 同时返回“first”和“one”,则需要将它们存储在一个数组中,然后该数组将是 1 映射到的值。

results = {}

hash1.each do |key, value|
  if results[key].nil?
    results[key] = [value]
  else
    results[key] << value

hash2.each do |key, value|
  if results[key].nil?
    results[key] = [value]
  else
    results[key] << value

results[1]
=> ["one", "first"]

更新

你显然不想要一个哈希。您想要一个仅包含值的数组。

results = hash1.values + hash2.values
=> ["one", "two", "three", "first", "second", "third"]

您可以像访问哈希一样访问此数组。请记住,数组是零索引的,因此:

results[0]
=> "one"
results[2]
=> "three"
results[5]
=> "third"

更新 2

现在你毕竟想要一个哈希,因为你有唯一的键。所以:

hash3 = hash1.merge(hash2)
于 2013-07-06T19:07:39.250 回答
2

由于您正在学习一门新语言,并且仍在学习事物的工作原理。我建议无论您在做什么,都可以查看开发人员文档。

http://ruby-doc.org/

从那里您可以搜索您正在寻找的任何内容,并找到您可以使用 ruby​​ 为您提供的 Objects 做的其他有趣的事情。

要专门回答您的问题,您需要merge使用哈希方法。

{1: 'One', 2: 'Two', 3: 'Three'}.merge(4: 'Four', 5: 'Five', 6: 'Six)

将产生{1: 'One', 2: 'Two', 3: 'Three', 4: 'Four', 5: 'Five', 6: 'Six'}

于 2013-07-06T19:48:20.547 回答