arrays - 对数组进行排序并将计数器存储在 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[] 中?谢谢。
解决方案
我相信您的代码的问题已被确定,因此我将建议一种替代方法。
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"]
推荐阅读
- android - 如何正确跟踪播放位置?[Android 媒体广播通知 Spotify API]
- html - CGI 脚本在 Apache2 (localhost) 中显示为纯文本
- c# - 反射铸造
- php - PHP从对象中删除空项目
- android - CropActivity 未在 Fragment 内的 onActivityResult 中启动
- python - Django 单元测试 - 客户端登录似乎不起作用
- python - urllib.requests.urlopen() 在 MacOS 上导致 CERTIFICATE_VERIFY_FAILED
- html - CSS重叠div在另一个具有相对位置/内联块的div上?
- google-bigquery - 正则表达式-如何在 BigQuery 中匹配单词 apple 而不是 pine_apple
- android - Firebase 使用电子邮件和密码验证登录失败,凭据正确