我有一个数组:
arr = ["Bar", "abc", "foo", "1", "20”, "10", "_def"]
我需要先按字母顺序对不区分大小写的字母进行排序,然后再按数字后跟特殊字符进行排序。
我正在尝试使用sort_by
:
irb(main):071:0> arr.sort_by {|s| [s[/[0-9a-z]+/], s.to_i]}
=> ["1", "10", "20", "abc", "Bar", "_def", "foo"]
输出必须是:
arr = ["abc", "Bar", "foo", "1", “10”, “20", "_def"]
从文档:
数组以“元素方式”进行比较;将第一个元素
ary
与other_ary
使用<=>
运算符的第一个元素进行比较,然后将每个第二个元素进行比较,依此类推…
您可以通过创建排序组来利用此行为:
arr = ["Bar", "abc", "foo", "1", "20", "10", "_def"]
arr.sort_by do |s|
case s
when /^[a-z]/i
[1, s.downcase]
when /^\d/
[2, s.to_i]
else
[3, s]
end
end
#=> ["abc", "Bar", "foo", "1", "10", "20", "_def"]
第一元件(1
,2
,3
)限定的组中的位置:与第一位置,在第二位置数字串和第三位置其余字母字符串。在每个组中,元素按第二个元素排序:带字母的字符串按其小写字母值,数字字符串按其整数值以及其余的按自身排序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句