2011-10-18 61 views
1

我有一個列表,我需要排序最流行的元素。有沒有辦法做到這一點?Ruby排序和消除重複項

我重新排序後,我也需要擺脫重複。我對此有一個想法,但它看起來效率低下,那麼是否有內置的方法來幫助解決這個問題?

回答

4
[1,5,4,6,4,1,4,5].group_by {|x| x}.sort_by {|x,list| [-list.size,x]}.map(&:first) 
=> [4,1,5,6] 

這樣呢?

0

對整個列表進行迭代以構建一個映射item -> number of times的散列,只需要對列表中的所有元素進行一次訪問,那麼使用散列的操作將是恆定時間,因此O(n)似乎並不昂貴。

3

Array#sort方法有一個可選的謂詞來比較兩個元素,所以...

list.sort { |a, b| a.popularity <=> b.popularity } 

爲了消除重複,使用Array#uniq

list.uniq 

地膠在一起,

list = list.sort { |a, b| a.popularity <=> b.popularity }.unique 

或者乾脆

list.sort! { |a, b| a.popularity <=> b.popularity }.uniq! 
0

uniq方法需要一個塊,因此您可以指定對象的哪個「屬性」必須是uniq。

new_list = list.sort_by{|el| el.popularity}.uniq{|el| el.popularity} 
0

大多數這些問題的答案並沒有爲我工作,除了格倫麥當勞(直到我張貼了這個答案) 我找到了答案,以我自己的問題在其他地方像這樣

list = [2,1,4,4,4,1] #for example 
count = Hash.new(0) 
list.each {|element| count[element] += 1} #or some other parameter than element 
list = list.uniq.sort {|x,y| count[y] <=> count[x]}