Ruby 排序和消除重复项

发布于 2024-12-10 21:01:04 字数 112 浏览 1 评论 0 原文

我有一个列表,需要按最流行的元素进行排序。有没有一种方法可以实现这一点?

重新排序后,我还需要删除重复项。我心里有一个这样的函数的想法,但它似乎效率低下,那么有内置的方法可以帮助解决这个问题吗?

I have a list that I need to sort by the most popular elements. Is there a method to accomplish that?

After I re-sort it, I also need to get rid of duplicates. I have an idea of a function in my mind for this but it seems inefficient, so are there built-in methods to help with this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

音盲 2024-12-17 21:01:04
[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,5,4,6,4,1,4,5].group_by {|x| x}.sort_by {|x,list| [-list.size,x]}.map(&:first)
=> [4,1,5,6]

Like that?

蹲在坟头点根烟 2024-12-17 21:01:04

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!

The Array#sort method takes an optional predicate to compare two elements, so...

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

To eliminate duplicates, use Array#uniq.

list.uniq

To glue them together,

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

Or simply

list.sort! { |a, b| a.popularity <=> b.popularity }.uniq!
浮萍、无处依 2024-12-17 21:01:04

迭代列表以构建映射 item ->; 的哈希值。次数 只需要访问列表中的所有元素一次,那么哈希操作将是常数时间,所以 O(n),这看起来并不那么昂贵。

Iterating through the list to build a hash that maps item -> number of times just need one visit of all elements of the list, then operations with the hash would be constant time, so O(n), that doesn't seem so expensive.

悲念泪 2024-12-17 21:01:04

uniq 方法采用一个块,因此您可以指定对象的哪个“属性”必须是 uniq。

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

The uniq method takes a block, so you can specify which 'property' of your object has to be uniq.

new_list = list.sort_by{|el| el.popularity}.uniq{|el| el.popularity}
街角迷惘 2024-12-17 21:01:04

这些答案中的大多数对我来说都不起作用,除了格伦·麦当劳(直到我发布这个答案)
我在其他地方找到了我自己问题的答案

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

Most of these answers didn't work for me, except for Glenn Mcdonalds (up until i posted this answer)
I found an answer to my own question somewhere else like this

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]}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文