此问题与this one不同。
我有一系列AR项目数组,如下所示:
[[1,2,3], [4,5,6], [7,8,9], [7,8,9], [1,2,3], [7,8,9]]
我想按第二个数组的相同数量排序:
[[7,8,9], [1,2,3], [4,5,6]]
我的真实数据更复杂,看起来像:
raw_data = {}
raw_data[:grapers] = []
suggested_data = {}
suggested_data[:grapers] = []
varietals = []
similar_vintage.varietals.each do |varietal|
# sub_array
varietals << Graper.new(:name => varietal.grape.name, :grape_id => varietal.grape_id, :percent => varietal.percent)
end
raw_data[:grapers] << varietals
所以,我想通过每个品种数组的最大值来对 raw_data [:grapers] 进行排序,比较这个值: grape_id 。
当我需要通过max occurencies对经典数据数组进行排序时,我会这样做:
grapers_with_frequency = raw_data[:grapers].inject(Hash.new(0)) { |h,v| h[v] += 1; h }
suggested_data[:grapers] << raw_data[:grapers].max_by { |v| grapers_with_frequency[v] }
此代码不起作用,因为那里有子阵列,包括我需要分析的AR模型。
答案 0 :(得分:2)
可能的解决方案:
array.group_by(&:itself) # grouping
.sort_by {|k, v| -v.size } # sorting
.map(&:first) # optional step, depends on your real data
#=> [[7, 8, 9], [1, 2, 3], [4, 5, 6]]
答案 1 :(得分:2)
我建议您查看sort_by
方法的Ruby documentation。它允许您使用与元素关联的任何内容对数组进行排序,而不是元素的值。
my_array.sort_by { |elem| -my_array.count(elem) }.uniq
=> [[7, 8, 9], [1, 2, 3], [4, 5, 6]]
此示例按原始数组中每个元素的计数排序。这之前是减号,因此具有最高计数的元素是第一个。 uniq
只有最终结果中每个元素的一个实例。
您可以在sort_by
区块中添加任何内容。
正如Ilya指出的那样,在每次迭代中使用my_array.count(elem)
将比预先使用group_by
更昂贵。这对您来说可能是也可能不是问题。
答案 2 :(得分:1)
arr = [[1,2,3], [4,5,6], [7,8,9], [7,8,9], [1,2,3], [7,8,9]]
arr.each_with_object(Hash.new(0)) { |a,h| h[a] += 1 }.
sort_by(&:last).
reverse.
map(&:first)
#=> [[7.8.9]. [1,2,3], [4,5,6]]
这使用Hash::new的形式,它接受一个参数(此处为0
),这是哈希值的默认值。