【问题标题】:Array in value of hash哈希值数组
【发布时间】:2012-06-10 01:54:19
【问题描述】:

如何将输入推入哈希值?我的问题是我有多个键,它们都引用数组。

{"A"=>["C"], "B"=>["E"], "C"=>["D"], "D"=>["B"]}

如何将另一个字符串推送到其中一个上?例如我想在键"A"的数组中添加一个"Z"

目前我要么覆盖以前的数组,要么所有数据都在一个中。

关于将数组["AB3", "DC2", "FG4", "AC1", "AF4"] 转换为带有{"A"=>["B", "C", "F"]} 的哈希。

【问题讨论】:

    标签: ruby arrays hash


    【解决方案1】:

    任何命令<<, push, unshift 都会起作用

    if h["A"] 
      h["A"] << "Z"
    else
      h["A"] = ["Z"]
    end
    

    【讨论】:

    • 这样不行。问题是没有数组可以推入当前“nil:NilClass”的未定义方法“for counter in 0..($graph.size)-1 do #Key wird erstellt temp_start = $graph[counter][0, 1] temp_finish = $graph[counter][1, 1] puts temp_start puts temp_finish $routen[temp_start] << temp_finish end end
    • 然后只检查值的存在
    • 非常感谢!我对编程和 ruby​​ 完全陌生,所以我没有找到这个简单的解决方案:)
    • @user1446375 来避免 undefined method " 错误你可以create the hash with a block:Hash.new { |h,k| h[k] = [] }。这样,块就为哈希提供了默认值。
    【解决方案2】:

    您说您最初的问题是将数组["AB3", "DC2", "FG4", "AC1", "AF4"] 转换为哈希{"A"=&gt;["B", "C", "F"]},可以这样完成:

    Hash[a.group_by { |s| s[0] }.map { |k, v| [k, v.map { |s| s[1] }] }]
    

    或者像这样:

    a.inject(Hash.new{|h, k| h[k]=[]}) { |h, s| h[s[0]] << s[1] ; h }
    

    请注意,Hash.new{|h, k| h[k]=[]} 创建了一个默认值为 [] 的数组(一个空数组),因此您始终可以使用 &lt;&lt; 向其中添加元素。

    【讨论】:

      【解决方案3】:

      更好的方法:

      在Hash中添加一个新的类方法如下:

      class Hash
        def add (k,v)
          unless self.key?k
            self[k] = [v] 
          else
            self[k] = self[k] << v
          end 
          self
        end 
      end
      
      
      h={}
      h.add('A','B') #=> {"A"=>["B"]}
      h.add('A','C') #=> {"A"=>["B", "C"]}
      h.add('B','X') #=> {"A"=>["B", "C"], "B"=>["X"]}
      

      完成。

      根据您的具体问题,这可能更加惯用;比如说,你想一次发送多个值,那么可以对代码进行 DRY 处理以处理多个参数。

      希望这会有所帮助。

      一切顺利。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-22
        • 2014-10-27
        • 2016-06-27
        • 1970-01-01
        • 2016-03-07
        • 1970-01-01
        • 2013-02-13
        • 1970-01-01
        相关资源
        最近更新 更多