Я хочу отсортировать мой массив:
p1q1 p1q10 p1q2
по следующему порядку:
p1q1 p1q2 p1q10
т.е.1009 *
Я пытаюсь с ids.sort { |id| id.to_i } конструкциями, но я, вероятно, заново изобретаю колесо ... какой самый читаемый / самый простой способ выполнить этот вид?
ids.sort { |id| id.to_i }
Самый простой способ, о котором я могу думать, это:
>> arr.sort_by { |id| id =~ /^p(\d+)q(\d+)$/ ; [$1.to_i, $2.to_i] } => ["p1q1", "p1q2", "p1q10"]
Это должно работать с произвольной глубиной, а не только с двумя уровнями:
ids.sort_by { |id| id.scan /\d+/ }
Я хотел бы что-то вроде этого:
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"]