Ruby排序和消除重复

时间:2011-10-18 17:41:54

标签: ruby arrays list sorting methods

我有一个列表,我需要按最流行的元素排序。有没有办法实现这个目标?

在我重新排序之后,我还需要摆脱重复。我有一个关于这个功能的想法,但它似乎效率低下,所以有内置的方法可以帮助解决这个问题吗?

5 个答案:

答案 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]}