use*_*916 4 ruby ruby-on-rails
我有一个数组:
\narr = ["Bar", "abc", "foo", "1", "20\xe2\x80\x9d, "10", "_def"]\nRun Code Online (Sandbox Code Playgroud)\n我需要首先按不区分大小写的字母顺序进行排序,然后按数字顺序排序,然后是特殊字符。
\n我正在尝试使用sort_by:
irb(main):071:0> arr.sort_by {|s| [s[/[0-9a-z]+/], s.to_i]}\n=> ["1", "10", "20", "abc", "Bar", "_def", "foo"]\nRun Code Online (Sandbox Code Playgroud)\n输出必须是:
\narr = ["abc", "Bar", "foo", "1", \xe2\x80\x9c10\xe2\x80\x9d, \xe2\x80\x9c20", "_def"]\nRun Code Online (Sandbox Code Playgroud)\n
来自文档:
\n\n\n数组以 \xe2\x80\x9celement-wise\xe2\x80\x9d 方式进行比较;使用运算符将 的第一个元素
\nary与第一个元素进行比较,然后将第二个元素中的每个元素进行比较,依此类推\xe2\x80\xa6other_ary<=>
您可以通过创建排序组来利用此行为:
\narr = ["Bar", "abc", "foo", "1", "20", "10", "_def"]\n\narr.sort_by do |s|\n case s\n when /^[a-z]/i\n [1, s.downcase]\n when /^\\d/\n [2, s.to_i]\n else\n [3, s]\n end\nend\n#=> ["abc", "Bar", "foo", "1", "10", "20", "_def"]\nRun Code Online (Sandbox Code Playgroud)\n第一个元素 ( 1, 2, 3) 定义组的位置:字母字符串位于第一个位置,数字字符串位于第二个位置,其余位于第三个位置。在每个组中,元素按第二个元素排序:包含字母的字符串按其小写值排序,数字字符串按其整数值排序,其余的则按其自身排序。
| 归档时间: |
|
| 查看次数: |
706 次 |
| 最近记录: |