Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails中基于频率的数组排序_Ruby On Rails_Ruby_Arrays - Fatal编程技术网

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