首页 > 解决方案 > 对数组进行排序并将计数器存储在 Ruby 中的另一个数组中

问题描述

我目前正在使用以下代码在 Ruby 中对数组(数字)进行排序:

grapes_sorted = vintages_grapes.group_by(&:itself).sort_by do |k, v| -v.size end.map(&:first) 

它工作得很好。但是,我想将与每个排序对应的计数器存储在另一个数组中。

我试过了:

grapes_sorted_counters = []
grapes_sorted = vintages_grapes.group_by(&:itself).sort_by do |k, v| 
                        -v.size 
                        grapes_sorted_counters << v.size 
                    end.map(&:first) 

它存储计数器,但是,排序已损坏,没有按应有的顺序排列。我想v.size(而不是-v.size)是块中问题的原因。

如何将出现次数正确存储在 grapes_sorted_counters[] 中?谢谢。

标签: arraysrubysorting

解决方案


我相信您的代码的问题已被确定,因此我将建议一种替代方法。

grapes = %w|red blue red green yellow red blue blue green red|
  #> ["red", "blue", "red", "green", "yellow", "red", "blue",
  #   "blue", "green", "red"]

grapes.tally.sort_by { |_,count| -count }.map(&:first)
  #=> ["red", "blue", "green", "yellow"]

请参阅Enumerable#tally

步骤如下。

h = grapes.tally
  #=> {"red"=>4, "blue"=>3, "green"=>2, "yellow"=>1} 
a = h.sort_by { |_,count| -count }
  #=> [["red", 4], ["blue", 3], ["green", 2], ["yellow", 1]] 
a.map(&:first)
  #=> ["red", "blue", "green", "yellow"] 

推荐阅读