代码之家  ›  专栏  ›  技术社区  ›  Anand Shah

如何为哈希键分配多个值?

  •  6
  • Anand Shah  · 技术社区  · 16 年前

    为了方便起见,我尝试在Ruby中为一个哈希键分配多个值。这是到目前为止的代码

    myhash = { :name => ["Tom" , "Dick" , "Harry"] }
    

    循环通过散列得到一个由3个值组成的串联字符串

    输出:

    name : TomDickHarry
    

    所需输出:

    :name => "Tom" , :name => "Dick" , :name => "Harry"
    

    我必须编写什么代码才能获得所需的输出?

    4 回复  |  直到 13 年前
        1
  •  6
  •   pierrotlefou    16 年前
    myhash.each_pair {|k,v| v.each {|n| puts "#{k} => #{n}"}}
    #name => Tom
    #name => Dick
    #name => Harry
    

    输出格式并不完全是您所需要的,但我认为您已经明白了。

        2
  •  5
  •   mikej heading_to_tahiti    16 年前

    在这种情况下,Rohith和pierr的回答很好。但是,如果您打算广泛使用它,那么值得一提的是,行为类似于散列但允许一个键有多个值的数据结构通常被称为多重映射。Ruby有几个实现,包括 this one

        3
  •  4
  •   the Tin Man    13 年前

    您已经创建了一个以符号名为键的散列,以及一个以三个元素为值的数组,因此需要遍历 myhash[:name] 获取单个数组元素。

        4
  •  3
  •   mikej heading_to_tahiti    16 年前

    re:在选择性键上迭代的问题。试用 reject 将条件倒置,而不是使用 select .

    e、 g.鉴于:

    {:name=>["Tom", "Dick", "Harry"], :keep=>[4, 5, 6], :discard=>[1, 2, 3]}
    

    :name :keep 但不是 :discard

    具有 :

    myhash.select { |k, v| [:name, :keep].include?(k) }
    => [[:name, ["Tom", "Dick", "Harry"]], [:keep, [4, 5, 6]]]
    

    但是 拒绝

    myhash.reject { |k, v| ![:name, :keep].include?(k) }
    => {:name=>["Tom", "Dick", "Harry"], :keep=>[4, 5, 6]}
    

    结果是一个仅包含所需条目的哈希。

    这可以与皮尔的答案结合起来:

    hash_to_use = myhash.reject { |k, v| ![:name, :keep].include?(k) }
    hash_to_use.each_pair {|k,v| v.each {|n| puts "#{k} => #{n}"}}