按照Ruby

时间:2017-03-21 09:08:14

标签: arrays ruby sorting

此问题与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模型。

3 个答案:

答案 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),这是哈希值的默认值。