Ruby on rails RubyonRails中基于频率的数组排序
我有一个嵌套的数字数组,排列如下:Ruby on rails RubyonRails中基于频率的数组排序,ruby-on-rails,ruby,arrays,Ruby On Rails,Ruby,Arrays,我有一个嵌套的数字数组,排列如下: ids = [[5,8,10],[8,7,25],[15,30,32],[10,8,7]] ids = [8,10,7,5,25,15,30,32] 我只需要一个包含所有键的数组,没有重复,因此我使用了以下方法: ids = ids.flatten.uniq 这就产生了: ids = [5,8,10,7,25,15,30,32] 由于我使用了.uniq,它消除了重复的值。但是,我想根据值在子数组中出现的频率对其进行排序,而不是根据它们碰巧出现的顺序进行
ids = [[5,8,10],[8,7,25],[15,30,32],[10,8,7]]
ids = [8,10,7,5,25,15,30,32]
我只需要一个包含所有键的数组,没有重复,因此我使用了以下方法:
ids = ids.flatten.uniq
这就产生了:
ids = [5,8,10,7,25,15,30,32]
由于我使用了.uniq
,它消除了重复的值。但是,我想根据值在子数组中出现的频率对其进行排序,而不是根据它们碰巧出现的顺序进行排序,因此如下所示:
ids = [[5,8,10],[8,7,25],[15,30,32],[10,8,7]]
ids = [8,10,7,5,25,15,30,32]
这应该做到:
ids.flatten.group_by {|i| i}.sort_by {|_, a| -a.count}.map &:first
对Ruby新手来说,速度慢但清晰易懂(希望如此):
flattened_ids = ids.flatten
unique_ids = flattened_ids.uniq
sorted_ids = unique_ids.sort_by { |e| -flattened_ids.count(e) }
可能不是最好的解决方案,但:
ids.flatten.each_with_object(Hash.new(0)) { |id, count| count[id] += 1 }.sort_by { |a| -a[1] }.map(&:first)
@QPaysTaxes-尝试一步一步地运行上面的命令,看看发生了什么。有什么你不确定的元素吗?我试过了,但它说在某些地方有语法错误,因为我是rails新手,所以我不太了解代码,而且我一辈子都看不到错误bro@BroiSatse我知道发生了什么,但如果你只提供代码,那么当有人遇到类似但不完全相同的问题时,但我不明白,这个答案毫无用处。如果你自己解释,其他人也可以使用。@fredo-在你的代码中,这行代码是什么样子的?:)在某些情况下,您可能需要执行
map(&:first)
。@Humza-此外,您的答案具有O(n^2)
复杂性,而所有其他答案都是O(n)
:P