我有一个目前按字母顺序排序的数组,我正在尝试按字符串的手动顺序对其进行排序。
当前代码:
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
我认为:
每个元素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"]
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。