在数字前排序字符串

时间:2014-07-29 12:11:20

标签: ruby-on-rails ruby sorting

为了确定范围,我正在寻找一种不寻常的排序机制 我们假设我们有以下数组:

arr = ["33", "a30", "b333", "44", "22", "a15"]

如何对其进行排序,以便非数字字符串在数字字符串之前排序? 这是我希望实现的结果

sorted_arr = ["a15", "a30", "b333", "22", "33", "44"]

我尝试了sort_bysort的各种组合,但我还没有达到正确的顺序......所以,任何帮助都将受到赞赏。感谢。

PS:我知道我写的是“用于范围目的”,但答案不需要在default_scope块中使用。一旦我找到了正确的分类技术,我会稍后再尝试调整它。

4 个答案:

答案 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"]]

然后它将两个数组连接在一起。