Есть ли способ сортировки так, чтобы «Витамин В12» не был перед «Витамином В6»?

ruby sorting natural-sort

160 просмотра

1 ответ

75610 Репутация автора

В Ruby on Rails порядок сортировки по умолчанию будет

Vitamin A
Vitamin B12
Vitamin B6

Существует ли механизм или быстрый способ сортировки по естественному языку, чтобы это B6показывалось раньше B12?

Автор: nopole Источник Размещён: 19.04.2011 04:35

Ответы (1)


8 плюса

136909 Репутация автора

Решение

Попробуйте что-то вроде:

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
Автор: sawa Размещён: 19.04.2011 04:45
32x32