我有
a = ["a", "d", "c", "b", "b", "c", "c"]
Run Code Online (Sandbox Code Playgroud)
并且需要打印类似的东西(按出现次数降序排序):
c:3
b:2
Run Code Online (Sandbox Code Playgroud)
我理解第一部分(发现非独特)是:
b = a.select{ |e| a.count(e) > 1 }
=> ["c", "b", "b", "c", "c"]
Run Code Online (Sandbox Code Playgroud)
要么
puts b.select{|e, c| [e, a.count(e)] }.uniq
c
b
Run Code Online (Sandbox Code Playgroud)
如何输出每个非唯一的向后排序的出现次数?
und*_*gor 22
puts a.uniq.
map { | e | [a.count(e), e] }.
select { | c, _ | c > 1 }.
sort.reverse.
map { | c, e | "#{e}:#{c}" }
Run Code Online (Sandbox Code Playgroud)
该group_by
方法通常用于此:
a.group_by{ |i| i } { "a" => [ [0] "a" ], "d" => [ [0] "d" ], "c" => [ [0] "c", [1] "c", [2] "c" ], "b" => [ [0] "b", [1] "b" ] }
我喜欢:
a.group_by{ |i| i }.each_with_object({}) { |(k,v), h| h[k] = v.size } { "a" => 1, "d" => 1, "c" => 3, "b" => 2 }
要么:
Hash[a.group_by{ |i| i }.map{ |k,v| [k, v.size] }] { "a" => 1, "d" => 1, "c" => 3, "b" => 2 }
其中一个可能会刮伤你的痒.从那里你可以使用一点测试来减少结果:
Hash[a.group_by{ |i| i }.map{ |k,v| v.size > 1 && [k, v.size] }] { "c" => 3, "b" => 2 }
如果您只想打印信息,请使用:
puts a.group_by{ |i| i }.map{ |k,v| "#{k}: #{v.size}" } a: 1 d: 1 c: 3 b: 2
归档时间: |
|
查看次数: |
7695 次 |
最近记录: |