如何为散列键分配多个值?
为了方便起见,我试图在Ruby中为散列键分配多个值。 这是迄今为止的代码
myhash = { :name => ["Tom" , "Dick" , "Harry"] }
循环遍历散列会给出3个值的串联字符串
输出:
name : TomDickHarry
要求输出:
:name => "Tom" , :name => "Dick" , :name => "Harry"
我必须编写什么代码才能获得所需的输出?
您已经创建了一个以符号名称作为键的哈希值和一个包含三个元素作为值的数组,因此您需要遍历myhash[:name]
以获取各个数组元素。
myhash.each_pair {|k,v| v.each {|n| puts "#{k} => #{n}"}} #name => Tom #name => Dick #name => Harry
输出格式并不完全符合您的需要,但我认为您可以理解。
在这种情况下,Rohith和pierr的答案很好。 但是,如果你要广泛使用它,那么值得知道的是,数据结构的行为类似于Hash但允许键的多个值通常被称为多重映射。 Ruby有几个这样的实现,包括这个 。
re:迭代选择键的问题。 尝试使用reject
条件而不是使用select
。
例如:
{:name=>["Tom", "Dick", "Harry"], :keep=>[4, 5, 6], :discard=>[1, 2, 3]}
我们想要的地方:name
和:keep
但不是:discard
select
:
myhash.select { |k, v| [:name, :keep].include?(k) } => [[:name, ["Tom", "Dick", "Harry"]], [:keep, [4, 5, 6]]]
结果是一对对列表。
但reject
:
myhash.reject { |k, v| ![:name, :keep].include?(k) } => {:name=>["Tom", "Dick", "Harry"], :keep=>[4, 5, 6]}
结果是Hash只包含您想要的条目。
然后可以将此与pierr的答案结合起来:
hash_to_use = myhash.reject { |k, v| ![:name, :keep].include?(k) } hash_to_use.each_pair {|k,v| v.each {|n| puts "#{k} => #{n}"}}