2013-03-07 40 views

回答

19
puts a.uniq. 
     map { | e | [a.count(e), e] }. 
     select { | c, _ | c > 1 }. 
     sort.reverse. 
     map { | c, e | "#{e}:#{c}" } 
+0

非常優雅! '_'代表什麼?我以前沒見過。 – 2013-03-08 00:08:16

+3

@RichardBrown:通常意味着未使用的變量名稱。 – Linuxios 2013-03-08 00:08:53

+0

哇!謝謝! – earlyadopter 2013-03-08 00:12:37

0

這會給你一個哈希值與element => occurrences

b.reduce(Hash.new(0)) do |hash, element| 
    hash[element] += 1 
    hash 
end 
+1

該塊可以放一點點更優雅:'hash.update(元素=>散列[元素] + 1)' – 2013-03-08 00:24:42

6

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 
0
puts a.uniq. 
    map { |e| a.count(e) > 1 ? [e, a.count(e)] : nil }.compact. 
    sort { |a, b| b.last <=> a.last } 
+0

'a&a.uniq'與'a'相同。 – 2013-03-08 00:22:42

+2

@undur_gongor我不認爲它是這樣的,但它與只有'a.uniq'一樣......不管怎樣,我在代碼中保留了uniq值,這使得它對這個問題不利,我修復了它。 – oldergod 2013-03-08 00:32:20

0
a.reduce(Hash.new(0)) { |memo,x| memo[x] += 1; memo } # Frequency count. 
    .select { |_,count| count > 1 } # Choose non-unique items. 
    .sort_by { |x| -x[1] } # Sort by number of occurrences descending. 
# => [["c", 3], ["b", 2]] 

另外:

a.group_by{|x|x}.map{|k,v|[k,v.size]}.select{|x|x[1]>1}.sort_by{|x|-x[1]} 
# => [["c", 3], ["b", 2]] 
0

如何:

a.sort.chunk{|x| a.count(x)}.sort.reverse.each do |n, v| 
    puts "#{v[0]}:#{n}" if n > 1 
end 
1

我個人這樣的解決方案:

a.inject({}) {|hash, val| hash[val] ||= 0; hash[val] += 1; hash}. 
    reject{|key, value| value == 1}.sort.reverse. 
    each_pair{|k,v| puts("#{k}:#{v}")} 
相關問題