自定义按另一个字符串数组排序字符串数组 - Ruby-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

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

小六码奴 2019-04-09 17:17:57 1008

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

当前代码:

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

Ruby
分享到
取消 提交回答
全部回答(1)
  • 小六码奴
    2019-07-17 23:33:01

    我认为:

    每个元素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"]

    0 0
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题