2016-11-16 26 views
0

里面重复的数字,我有以下阵列发现大多数一阵列

[1, 2, 3, 4, 5, 1, 2, 5, 3, 4, 2, 3, 1, 3, 2, 2]` 

我想找出两件事情:

1)有多少每个号码的重复呢?

例如:1日3次4,2倍

2)求出在array 3个最重复号码。

例如:[2, 3, 1]因为被复制5倍,被复制4次 & 被复制3倍

我已经试过

arr = [1, 2, 3, 4, 5, 1, 2, 5, 3, 4, 2, 3, 1, 3, 2, 2] 
= arr.group_by { |e| e }.map { |e| e[0] if e[1][1] }.compact 

但结果不是我要找:[1, 2, 3, 4, 5]

+0

此问题与[tag:ruby-on-rails]无关,标记已移除。 – mudasobwa

回答

3

要获得重复的条目的数量每重复你可以去:

arr.group_by(&:itself) 
    .each_with_object({}) {|(k, v), hash| hash[k] = v.size } 
#=> {1=>3, 2=>5, 3=>4, 4=>2, 5=>2} 

拿到3名最重复的条目:

arr.group_by(&:itself) 
    .sort_by { |_k, v| -v.size } 
    .take(3) 
    .map(&:first) 
#=> [2, 3, 1] 
+0

谢谢@Andrey :) – Rubioli

7
▶ arr.group_by { |e| e } # arr.group_by(&:itself) for Ruby >= 2.2 
    .map { |k, v| [k, v.count] } #⇒ [[1, 3], [2, 5], [3, 4], [4, 2], [5, 2]] 
    .sort_by { |(_, cnt)| -cnt } #⇒ [[2, 5], [3, 4], [1, 3], [4, 2], [5, 2]] 
    .take(3)      #⇒ [[2, 5], [3, 4], [1, 3]] 
    .map(&:first) 
#⇒ [2, 3, 1] 

删除最后三个条款来得到整个无序的结果。

+0

谢谢@mudasobwa :) – Rubioli

0

1)有多少每个号码的重复呢?

counts = Hash[arr.uniq.map{|_x| [_x, arr.count(_x)]}] 
=> {1=>3, 2=>5, 3=>4, 4=>2, 5=>2} 

2)所述阵列中找到3个最重复号码

counts.sort_by { |a, b| -b }.take(3).map(&:first) 
=> [2, 3, 1] 
0
arr = [1, 2, 3, 4, 5, 1, 2, 5, 3, 4, 2, 3, 1, 3, 2, 2] 

我建议使用一个计数散列(参见标号为 “默认值” 在Hash::new):

h = arr.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 } 
    # => {1=>3, 2=>5, 3=>4, 4=>2, 5=>2} 

并使用方法Enumerable#max_by,参数为3获得的h三个键具有最大值:

h.max_by(3, &:last).map(&:first) 
    #=> [2, 3, 1] 

注意,如果h稍大,使用max_by与一种说法是更有效的,使用Enumerable#sort_byArray#sort然后丢弃所有,但三个最大值。 Enumerable方法max_by,min_bymaxmin已被更改为允许在Ruby v2.2中使用参数(默认为1)。