Ruby Array 和 Hash 的问题

yeyong14 · 2014年04月30日 · 最后由 yeyong14 回复于 2014年04月30日 · 2446 次阅读
arr = [1,1,1,2,2,3]
#怎么到hash成这样
hash = {1=>3, 2=>2, 3=>1}

怎么规律,看不出来

Hash[arr.group_by{|v| v }.map{|k, v| [k , v.size] }]

arr.group_by{|v| v }.tap{|h| h.each {|k, v| h[k] = v.size} }

许久不用 Ruby,有些生疏了,见谅。

实验了@skandhas的方法: irb(main):001:0> arr=[1, 1, 1, 2, 2, 3] => [1, 1, 1, 2, 2, 3] irb(main):002:0> arr.group_by{|v| v} => {1=>[1, 1, 1], 2=>[2, 2], 3=>[3]} irb(main):003:0> arr.group_by{|v| v}.map{|k, v| [k, v.size] } => [[1, 3], [2, 2], [3, 1]] irb(main):004:0> Hash[arr.group_by{|v| v}.map{|k, v| [k, v.size] }] => {1=>3, 2=>2, 3=>1}

Hash 可以这么初始化,很方便耶 Hash[ [ [key, value], ... ] ] → new_hash

arr.uniq.inject({}) {|h,n| h.merge! n => arr.count(n)}

{}.tap {|h| arr.each {|n| h[n] = (h[n]||0) + 1}}

Hash.new(0).tap {|h| arr.each {|n| h[n] += 1}}

@skandhas 真是人才啊,真的很方便啊,谢谢

需要 登录 后方可回复, 如果你还没有账号请 注册新账号