有没有办法排序,以便“维生素B12”不在“维生素B6”的前面?

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

Vitamin A Vitamin B12 Vitamin B6 

是否有机制或快速方式,以便它按自然语言方式排序,以便B6B12之前显示?

尝试以下方法:

 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