开发者社区> 问答> 正文

自定义按另一个字符串数组排序字符串数组 - Ruby

我有一个目前按字母顺序排序的数组,我正在尝试按字符串的手动顺序对其进行排序。

当前代码:

list = ["gold","silver","bronze","steel","copper"]

list = list.sort { |a, b| a <=> b }
我想要实现的目标:(以空白条目作为分隔符)

list = ["gold","silver","bronze","steel","copper"]

sort_order = ["bronze","silver","gold","","copper","steel"]

list = list.sort_by sort_order
输出:青铜| 银| 金| - | 铜| 钢

这可能吗?目前卡住这些错误消息:

comparison of Integer with nil failed
comparison of String with String failed

展开
收起
小六码奴 2019-04-09 17:17:57 3076 0
1 条回答
写回答
取消 提交回答
  • 我认为:

    每个元素list都在sort_order;
    sort_order可能包含不在的元素list;
    list可能包含重复; 和
    sort_order 不包含重复项。
    如果sort_order最初包含重复项,sort_order.uniq则可以在计算中使用临时数组。

    观察如果,如在示例中,不list包含重复项并且sort_order不包含其他元素,则按其元素的顺序list排序是微不足道的,因为它仅返回。listsort_ordersort_order

    以下是比使用方法更有效sort或sort_by(O(n)相对O(n*log(n))的计算复杂度。)

    list = ["gold", "copper", "silver", "copper", "steel", "gold"]
    sort_order = ["bronze", "silver", "tin", "gold", "copper", "steel"]

    count = list.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
    #=> {"gold"=>2, "copper"=>2, "silver"=>1, "steel"=>1}
    sort_order.flat_map { |e| [e]*count[e] }.reject(&:empty?)
    #=> ["silver", "gold", "gold", "copper", "copper", "steel"]

    2019-07-17 23:33:01
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载