我有一种方法可以达到我的目的,唯一的问题是我真的不知道发生了什么,并且可以用外行术语来解释。特别是最后评估的一行:
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
答案 0 :(得分:1)
map
返回基于传入的值的投影。在这种情况下,它返回一个由 - 对于每个键/值对 - 哈希键或nil
组成的数组,取决于值是否与max[1]
匹配。
[1, 2, 3].map{|a| a.odd? ? a : nil}
=> [1, nil, 3]
在这种情况下,hash
只会转换为值匹配max[1]
的键(nils被compact
删除),然后按长度排序,第一个(最小长度)返回。
这个算法可以使用相当多的改进,但这就是所讨论的行的工作原理。
答案 1 :(得分: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.