2013-07-15 3 views
0

У меня есть хэш, который выглядит, как этотзаказать хэш в рельсах

{"1-5 lbs"=>107342.43999999999, "31+ lbs"=>39838.58000000001, "21-30 lbs"=>19036.41, "11-20 lbs"=>39350.95, "6-10 lbs"=>41401.880000000005}

И я хотел бы, чтобы отсортировать его, так это выглядит, как этот

{"1-5 lbs"=>107342.43999999999, "6-10 lbs"=>41401.880000000005, "11-20 lbs"=>39350.95, "21-30 lbs"=>19036.41, "31+ lbs"=>39838.58000000001 }

логика хранится в переменной экземпляра @weight_ranges

ответ

2

Вам нужно будет получить регулярные выражения, чтобы получить стоимость e первого номера каждого диапазона .

Hash[(@weight_ranges.sort_by {|key, value| key.scan(/\d+/)[0].to_i})] 

Чтобы разбить его дальше:

# Sort the weight ranges by the first series of digits found in the key 
x = @weight_ranges.sort_by {|key, value| key.scan(/\d+/)[0].to_i} 
# Convert each inner Array to a key, value pair in a Hash 
x = Hash[x] 
+0

На самом деле вы можете уйти без регулярных выражений здесь. – Gene

+0

Хорошая точка - хороший отзыв о том, как работает '# to_i'. – acsmith

1

Вы изображены данные в виде хэша. Для последовательности вам понадобится массив пар. Что-то, как это будет делать:

list_of_pairs = @weight_ranges.keys.sort_by(&:to_i).map {|k| [k, @weight_ranges[k]]} 

Это использует счастливое совпадение, что to_i останавливается на первом нецифры он видит.

Коррекция

Я только что узнал, что в версии 1.9 упорядочены Рубиновые хэши! Так что легко адаптироваться:

Hash[@weight_ranges.sort_by{|k,v| k.to_i}] 

Я оставлю обе идеи здесь, так как первый из них до сих пор право на Ruby, < 1.9.

+0

Одна заметка - первый пример фактически возвращает массив, а не хэш, который, я думаю, является тем, что он ищет. Но обертывание его в Hash [] исправляет это. – acsmith

+0

@acsmith Right. Я не понимал, пока кто-то еще не сообщил, что хеши Ruby теперь заказаны. До 1.9 их не было. Поэтому я подумал, что ему нужны массивы, чтобы получить строгую последовательность. Я не уверен, какой метод создает меньше мусора. «Слияние!» По-прежнему нуждается в хеше 1-х ключевого аргумента. Вероятно, нужно попробовать простое назначение. – Gene

Смежные вопросы