-3

我有一种适用于我的目的的方法,唯一的事情是我真的不知道发生了什么,并且可以用外行的方式进行解释。特别是最后评估的行:

hash.map{ |k,v| v==max[1] ? k : nil }.compact.sort_by(&:length).first

这是我的代码:

 def self.largest_hash_key(hash)
    max = hash.max_by{ |k,v| v }
    seven = hash.max_by{ |k,v| k.length }.first
    if seven.length == 7
     seven
    else
     hash.map{ |k,v| v==max[1] ? k : nil }.compact.sort_by(&:length).first
    end
  end
4

2 回答 2

1

map根据传入的值返回一个投影。在这种情况下,它返回一个由 - 对于每个键/值对 - 哈希键或 组成的数组nil,具体取决于值是否匹配max[1]

[1, 2, 3].map{|a| a.odd? ? a : nil}
=> [1, nil, 3]

在这种情况下,hash被转换为值匹配的键max[1](nil 被 去除compact),然后按它们的长度排序,并返回第一个(最小长度)。

该算法可以使用相当多的改进,但这就是所讨论的行的工作方式。

于 2013-05-13T17:19:23.973 回答
1
 hash.map{ |k,v| v==max[1] ? k : nil }.compact.sort_by(&:length).first

方法:

For the hash passed in
For each key-value pair (that's the `.map`)
See if the value matches the maxiumum value that was found in the hash 
    by the `hash.max_by{ |k,v| v }` expression

If so, use the that key value, otherwise use nil (ignore it)
Take that result and `compact` it make it be the actual result (remove those nil elements).
Sort by length # Not sure if this is needed?
Return the key-value pair as an array rather than the hash passed in.
于 2013-05-13T17:33:36.550 回答