Ruby有一个natural_sort_by方法吗?

Nat*_*ird 15 ruby ruby-on-rails

我有一堆带有一堆属性的文件.其中一个属性是文件名,这就是我要对列表进行排序的方式.但是,列表如下所示:filename 1,filename 2,filename 10,filename 20.

ruby sort_by方法产生了这个:

files = files.sort_by { |file| file.name }
=> [filename 1, filename 10, filename 2, filename 20]
Run Code Online (Sandbox Code Playgroud)

我想要一个更易读的列表,如文件名1,文件名2,文件名10,文件名20

我找到了natural_sort gem,但它似乎只能像sort方法一样工作.我需要一些东西,我可以指定对数组进行排序的内容.

有帮助吗?

tad*_*man 25

这是对"自然"排序方法的另一种看法:

class String
  def naturalized
    scan(/[^\d\.]+|[\d\.]+/).collect { |f| f.match(/\d+(\.\d+)?/) ? f.to_f : f }
  end
end
Run Code Online (Sandbox Code Playgroud)

这会将类似的内容"Filename 10"转换为一个简单的数组,浮点数代替数字[ "Filename", 10.0 ]

您可以在列表中使用此选项:

files.sort_by! { |file| file.name.to_s.naturalized }
Run Code Online (Sandbox Code Playgroud)

这具有在不可预测的位置处理任意数字的优点.该.to_s块中的偏执调用是为了确保nil在排序时存在字符串而不是无意中.


shu*_*ikk 15

字符串自然排序的通用答案

array.sort_by {|e| e.split(/(\d+)/).map {|a| a =~ /\d+/ ? a.to_i : a }}
Run Code Online (Sandbox Code Playgroud)


Dog*_*her 7

我创造了一个天然的宝石.它可以按如下属性排序:

# Sort an array of objects by the 'number' attribute
Thing = Struct.new(:number, :name)
objects = [
  Thing.new('1.1', 'color'),
  Thing.new('1.2', 'size'),
  Thing.new('1.1.1', 'opacity'),
  Thing.new('1.1.2', 'lightness'),
  Thing.new('1.10', 'hardness'),
  Thing.new('2.1', 'weight'),
  Thing.new('1.3', 'shape')
  ]
Naturally.sort_by(objects, :number)

# => [#<struct Thing number="1.1", name="color">,
      #<struct Thing number="1.1.1", name="opacity">,
      #<struct Thing number="1.1.2", name="lightness">,
      #<struct Thing number="1.2", name="size">,
      #<struct Thing number="1.3", name="shape">,
      #<struct Thing number="1.10", name="hardness">,
      #<struct Thing number="2.1", name="weight">]
Run Code Online (Sandbox Code Playgroud)


Wil*_*iam 6

只要文件总是被命名"file #",你就可以做到

files.sort_by{|f| f.name.split(" ")[1].to_i }

这会拆分空间,并抓取数字进行排序.

  • 或者,您可以使用`.last`而不是`[1]`,所以`files.sort_by {| f | f.name.split("").last.to_i}` (2认同)