我有一个列表,我需要按最流行的元素排序。有没有办法实现这个目标?
在我重新排序之后,我还需要摆脱重复。我有一个关于这个功能的想法,但它似乎效率低下,所以有内置的方法可以帮助解决这个问题吗?
答案 0 :(得分: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]
喜欢那个?
答案 1 :(得分: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!
答案 2 :(得分:0)
遍历列表来构建映射item -> number of times
的哈希只需要访问列表的所有元素,然后使用哈希的操作将是恒定时间,所以O(n),似乎不是太贵了。
答案 3 :(得分:0)
uniq方法采用一个块,因此您可以指定对象的哪个“属性”必须是uniq。
new_list = list.sort_by{|el| el.popularity}.uniq{|el| el.popularity}
答案 4 :(得分:0)
除了Glenn Mcdonalds(直到我发布这个答案),这些答案中的大部分对我都不起作用 我在其他地方找到了回答我自己的问题
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]}