2013-01-23 4 views
0

У меня есть следующий массив ...Сортировка массива Ruby, основанный на части строки

[ "global/20130102-001", "global/20131012-001, "country/uk/20121104-001" ] 

Мне нужно сортировать массив на основе численной части строки. Таким образом, выше будет отсортирован как:

[ "country/uk/20121104-001", "global/20130102-001", "global/20130112-001 ] 

Есть ли способ вызова .sort и игнорировать первую часть каждого элемента, так что я только сортировка по количеству?

+0

Какая численная часть? Первый? Второй? Сочетание обоих? – sawa

ответ

3

Да, есть способ. Для этого вы должны использовать #sort_by. Его блок передается элементом массива и должен возвращать «сортируемое значение» элемента. В этом случае мы используем регулярное выражение для поиска вашей строки цифр (вы можете использовать другую логику там, конечно, как разбиение на косую черту).

arr = [ "global/20130102-001", "global/20131012-001", "country/uk/20121104-001" ] 

arr.sort_by {|el| el.scan(/\d{8}-\d{3}/)} # => ["country/uk/20121104-001", "global/20130102-001", "global/20131012-001"] 
+0

Это выглядит здорово, но, к сожалению, я использую v1.8.7 – user1074981

+0

Я только что протестировал его, и это работает на Ruby 1.8.7. –

+0

Я получаю undefined метод 'sort_by! ' для # <Массив: 0x7f7c81762410> (NoMethodError). Нет sort_by! метод в ruby ​​doc http://ruby-doc.org/core-1.8.7/Array.html – user1074981

4

Несомненно, просто используйте sort_by.

arr.sort_by do |s| 
    s.split('/').last 
    end 
Смежные вопросы