【问题标题】:Ruby iterate through hash and compare value pairsRuby 遍历哈希并比较值对
【发布时间】:2016-02-27 13:36:33
【问题描述】:

我的 Ruby 任务是遍历哈希并返回与最小值关联的键,不使用,使用以下任何方法:

#keys #values #min #sort #min_by

我不明白如何遍历散列并在每对通过时存储它,将其与通过的最后一对进行比较,并返回最低的键。这是我的代码,向您展示我的思考过程,但它当然不起作用。关于如何做到这一点的任何想法?谢谢!

def key_for_min_value(name_hash)
  index = 0 
  lowest_hash = {}

  name_hash.collect do |key, value|
    if value[index] < value[index + 1]
      lowest = value
      index = index + 1 
      key_for_min_value[value]

      return lowest
    end
  end
end 

【问题讨论】:

  • 试试Hash#eachhash.each do |k,v| ... end
  • 合适的解决方案当然是hash.min_by(&amp;:last).first
  • 那是什么?您想要 3 个最小值的键吗?使用 v2.2,没问题:h.min_by(3,&amp;:first).map(&amp;:first).

标签: ruby hash iteration


【解决方案1】:

我们可以使用Enumerable#reduce 方法来比较条目并选择最小值。每个哈希条目在 reduce 方法中作为一个包含 2 个元素的数组传入,因此,我使用 Array#firstArray#last 方法来访问键和值。

h = {"a" => 1, "b" => 2, "c" => 0}
p h.reduce{ |f, s| f.last > s.last ? s : f }.first
#=> "c"

【讨论】:

    【解决方案2】:

    一种方法是将我们的哈希转换为数组;

    def key_for_min_value(name_hash)
      # Convert hash to array
      name_a = name_hash.to_a
    
      # Default key value
      d_value= 1000
      d_key= 0
    
      # Iterate new array 
      name_a.each do |i|
          # If current value is lower than default, change value&key 
          if i[1] < d_value
            d_value = i[1]
            d_key = i[0]
          end
    
       end
    
      return d_key
    
    end  
    

    您可能需要将 d_value 更改为更高的值或找到更有创意的东西:)

    【讨论】:

      【解决方案3】:

      跟踪 min_valuekey_for_min_value。遍历哈希,只要当前value 低于min_value,就更新这两个变量。在循环结束时,返回key_for_min_value

      我没有包含示例代码,因为,嘿,这是家庭作业。 :) 祝你好运!

      【讨论】:

      • Karen,如果散列的键值对表示为[k,v],通过这种方法,您将比较vmin_value,并更新min_valuekey_for_min_valuev &lt; min_value。但是你如何开始呢?当您检查第一个键值对时,min_value 尚未定义。有两种处理方法。第一种是将min_value 初始化为一个非常大的数字,最好的选择是Float:INFINITY。第二种方式是将min_value初始化为(比如)nil,然后写入if min_val == nil...else ...end
      猜你喜欢
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多