2016-11-16 31 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)。