2012-08-28 36 views
1

實例我有一個數組:X = [A,B,C,d,E,F,G,H],它可以具有1對象至9找出哪些對象具有n在紅寶石

首先,如果這些物體中的任何一個出現3次,我必須計數。我不想寫

if (x.count(1) == 3) or (x.count(2) == 3) ...etc... 

有沒有辦法縮短這個,就像下面?其次,如果我知道一個對象已經找到3個實例,我怎麼能找出它是哪一個呢? (1或2或3 ......)

回答

0
x = [:a, :b, :b, :b, :c, :c, :c] 
counted = Hash[ 
    x.group_by do |e| 
    x.count(e) 
    end.map do |count, items| 
    [count, items.uniq] 
    end 
] 
p counted[3] #=> [:b, :c] 

這是如何工作的?讓我們按照步驟。首先,讓我們組的項目由數:

grouped_by_count = x.group_by do |e| 
    x.count(e) 
end 

這將產生與被計數密鑰的哈希值,並且是具有該計數非唯一的項目列表中的值:

p grouped_by_count 
#=> {1=>[:a], 3=>[:b, :b, :b, :c, :c, :c]} 

我們倒是真的寧願獨特項目,不過,讓我們做的變換:

grouped_by_count_unique = grouped_by_count.map do |count, items| 
    [count, items.uniq] 
end 
p grouped_by_count_unique 
#=> [[1, [:a]], [3, [:b, :c]]] 

這給了我們一個數組的數組,而不是一個哈希值。幸運的是,很容易把數組的數組到哈希:

counted = Hash[grouped_by_count_unique] 
p counted 
# => {1=>[:a], 3=>[:b, :c]} 

現在只是把拼湊消除臨時對象,你會得到頂部的答案。

+0

輝煌,謝謝,它也很優雅!我會冥想它。 – csikiati