如何在Ruby中找到数组项小于或等于哈希值的哈希键

时间:2014-04-27 09:02:35

标签: ruby

我是Ruby的新手,并尝试从IOI解决this question以进行自学。

我有以下哈希和数组。 myhash有popularity of sports => cost for construction。每个votes值都是构造的限制。如果它小于或等于popu_cost的施工成本,它将获得投票,并将从最高人气来检查。一旦发现,无需检查其他运动。

popu_cost = {1=>8, 2=>8, 3=>7, 4=>5, 5=>2, 6=>5, 7=>2, 8=>7, 9=>2, 10=>1}
votes = [2, 8, 4, 1, 8, 2, 10, 3, 2, 2]

现在我想在votes element <= hash value找到哈希键并添加到results[]。例如

votes[0], max cost afford is 2. So hash index 5 since 2 is less than or equal to 2
votes[1], 8 is hash index 1 since 8 is less than or equal to 8
votes[2], 4 is hash index 5 since 2 is less than or equal to 4
votes[3], 1 is hash index 10 since 1 is less than or equal to 1
votes[4], 8 is hash index 1 since 8 is less than or equal to 8
votes[5], 2 is hash index 5 since 2 is less than or equal to 2
votes[6], 10 is hash index 1 since 8 is less than or equal to 10
votes[7], 3 is hash index 5 since 2 is less than or equal to 3
votes[8], 2 is hash index 5 since 2 is less than or equal to 2
votes[9], 2 is hash index 5 since 2 is less than or equal to 2

这应该给出[5,1,5,10,1,5,1,5,5,5]。

我尝试了以下但结果不是我的预期。

results = []
votes.each{ |ele| popu_cost.each{ |key, val| 
  if l <= val
  results << key
  end
}}
results

2 个答案:

答案 0 :(得分:1)

您可以使用.map.find轻松解决此问题,其中.map将转化应用于每个输入元素,并输出包含每个转换结果的列表,{{1} }可用于查找.find的第一个元素,它为给定的块产生Enumerable

我使用它们来执行您指定的比较,而.first将仅返回Hash的true,这是您感兴趣的内容。key部分指定lambda如果找不到任何内容,则产生一个空数组,因此-> {[]}将产生.first。当nil包含的值小于votes的所有元素时,就会发生这种情况。

popu_cost

答案 1 :(得分:1)

您需要稍微修改一下代码。但首先,需要澄清这个问题。我的理解(纠正我,如果我错了)是,对于e的每个元素votes,您希望找到k=>v的第一个元素popu_cost e >= v k 1}}和(如果找到一个)将键result添加到数组votes。例如,k=>v的第一个元素是2. 2 >= v5=>2的第一个元素result << 5popu_cost = {1=>8, 2=>8, 3=>7, 4=>5, 5=>2, 6=>5, 7=>2, 8=>7, 9=>2, 10=>1} votes = [2, 8, 4, 1, 8, 2, 10, 3, 2, 2, 0] results = [] votes.each do |e| key, _ = popu_cost.find { |_, val| e >= val } results << key if key end results #=> [5, 1, 5, 10, 1, 5, 1, 5, 5, 5]

注意我们必须假设这是针对Ruby 1.9+的,因为我们依赖于哈希来维护其插入顺序。

以下是对代码的修改,用于创建所需的数组:

find

请注意,我已使用each votes。那是你的主要问题。您不希望找到满足votes的每个元素的条件的所有哈希元素,只是第一个元素。

请注意,我为您为k=>v提供的示例添加了零。这表明,当e >= v的哈希没有元素result时,{{1}}没有添加任何键。