为了确定范围,我正在寻找一种不寻常的排序机制 我们假设我们有以下数组:
arr = ["33", "a30", "b333", "44", "22", "a15"]
如何对其进行排序,以便非数字字符串在数字字符串之前排序? 这是我希望实现的结果
sorted_arr = ["a15", "a30", "b333", "22", "33", "44"]
我尝试了sort_by
和sort
的各种组合,但我还没有达到正确的顺序......所以,任何帮助都将受到赞赏。感谢。
PS:我知道我写的是“用于范围目的”,但答案不需要在default_scope
块中使用。一旦我找到了正确的分类技术,我会稍后再尝试调整它。
答案 0 :(得分:4)
arr.sort_by{|e| [e =~ /\A\d/ ? 1 : 0, e.your_original_sort_condition]}
答案 1 :(得分:1)
这是另一种方法。
<强>代码强>
def sort_em(arr)
a = arr.sort
return a if a.first =~ /\D/ || a.last !~ /\D/
a.rotate(a.index(a.find { |e| e =~ /\D/ }))
end
示例强>
arr = ["33", "a30", "b333", "44", "22", "a15"]
sort_em(arr)
#=> ["a15", "a30", "b333", "22", "33", "44"]
备注强>
sort
,则无效。 " 1"
或"1 "
可能存在且被视为&#34;数字&#34;,请在.strip
和{{1}之前添加=~
}。 ~=~
为空,arr
先生们,启动引擎
[].first =~ /^\d+$/ #=> nil
不可否认,这是一个非常有限的基准。
答案 2 :(得分:0)
这不是最优雅的解决方案,但实现此目的的一种方法是创建两个数组,一个包含以非数字开头的所有元素,一个包含以数字项开头的所有元素。对两个数组进行排序,然后连接数组
答案 3 :(得分:0)
你可以这样做:
arr.sort.partition { |x| x[/^[^\d]/] }.inject(:+)
# => ["a15", "a30", "b333", "22", "33", "44"]
这会对数组进行排序,然后它将所有不以数字开头的元素和所有执行的元素分组:
arr.sort.partition { |x| x[/^[^\d]/] }
# => [["a15", "a30", "b333"], ["22", "33", "44"]]
然后它将两个数组连接在一起。