Сортировка массива строковых целочисленных идентификаторов (например, "chapter3lesson11") - PullRequest
1 голос
/ 14 сентября 2011

Я хочу отсортировать мой массив:

p1q1
p1q10
p1q2

по следующему порядку:

p1q1
p1q2
p1q10

т.е.1009 *

Я пытаюсь с ids.sort { |id| id.to_i } конструкциями, но я, вероятно, заново изобретаю колесо ... какой самый читаемый / самый простой способ выполнить этот вид?

Ответы [ 3 ]

3 голосов
/ 14 сентября 2011

Самый простой способ, о котором я могу думать, это:

>> arr.sort_by { |id| id =~ /^p(\d+)q(\d+)$/ ; [$1.to_i, $2.to_i] }
=> ["p1q1", "p1q2", "p1q10"]
0 голосов
/ 14 сентября 2011

Это должно работать с произвольной глубиной, а не только с двумя уровнями:

ids.sort_by { |id| id.scan /\d+/ }
0 голосов
/ 14 сентября 2011

Я хотел бы что-то вроде этого:

def p_q_str_to_num(str)
  str =~ /p(\d+)q(\d+)/
  ($1+$2).to_i
end

a = ["p1q1", "p1q10", "p1q2"]
a.sort {|x,y| p_q_str_to_num(x) <=> p_q_str_to_num(y)}

Возвращает:

["p1q1", "p1q2", "p1q10"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...