ruby - 有没有办法让 "Vitamin B12"不在 "Vitamin B6"前面?

标签 ruby sorting natural-sort

在 Ruby on Rails 中,默认的排序顺序是

Vitamin A
Vitamin B12
Vitamin B6

是否有一种机制或快速方法,使其以自然语言方式排序,使 B6 显示在 B12 之前?

最佳答案

尝试这样的事情:

class Array
  def smart_sort
    sort_by{|s| (' '+s).scan(/(\d+)|(\D+)/).map{|d, s| s || d.to_i}}
  end
end

a = ['Vitamin A', 'Vitamin B12', 'Vitamin B6']
p a.smart_sort

# => ["Vitamin A", "Vitamin B6", "Vitamin B12"]

它按数字和非数字交替排序。

b = ['3c17d', '1a34be',  '3x1a', '1b01c', '1a34bb']
p b.smart_sort

# => ["1a34bb", "1a34be", "1b01c", "3c17d", "3x1a"]

这可能类似于在 Windows 中对目录中的文件名进行排序时所做的操作。


更新:较新的版本。不需要 ' '+,因为它由 split 自动提供。它还消除了在正则表达式中指定互补 \d\D 的冗余。

class Array
  def smart_sort
    sort_by{|s| s.split(/(\d+)/).each_slice(2).flat_map{|s, d| [s, d.to_i]}}
  end
end

关于ruby - 有没有办法让 "Vitamin B12"不在 "Vitamin B6"前面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5711640/

相关文章:

ruby-on-rails - gem 安装在包文件夹(供应商/包)

ios - 根据 Swift iOS 中的大小对文档目录中的文件和文件夹进行排序

ios - 无法排序我的NSMutablearray

algorithm - 如果字符串集中有多个可识别的数字序列,自然排序应该如何工作?

mysql自然排序

Ruby 未定义的局部变量 byebug

ruby-on-rails - Rails 表单不断返回 nomethoderror

ruby-on-rails - Rails 3.2.21 和 Ruby 2.2.0 破坏了 Time.zone.parse

python - 自然排序

python - 按自然顺序对字典键进行排序