2016-04-18 4 views
-1

Я новичок в рубине. Мой вопрос: есть 2 хэшиruby: сравнение элементов двух хешей

первое: имя => зарплата

people = { 
    "Jack" => 1500, 
    "John" => 3000, 
    "Peter" => 2500, 
    "Simon" => 4000 
} 

второй: автомобиль => цена

cars = { 
    "Audi" => 50000, 
    "BMW" => 70000, 
    "Skoda" => 30000, 
    "Volvo" => 40000 
} 

И я нужен код, то результат будет новый отсортированный хэш "name_of_richest_man" => "the_most_expensive_car"

result = { 
    "Simon" => "BMW", 
    "John" => "Audi", 
    "Peter" => "Volvo", 
    "Jack" => "Skoda" 
} 
+0

Что ты пробовал так далеко? Пожалуйста, опубликуйте некоторый прогресс. – ehh

ответ

3
people.sort_by{|_, v| v}.zip(cars.sort_by{|_, v| v}) 
.reverse 
.map{|(k, _), (v, _)| [k, v]}.to_h 
# => {"Simon"=>"BMW", "John"=>"Audi", "Peter"=>"Volvo", "Jack"=>"Skoda"} 

Или, чтобы сделать его более удобным для чтения,

[people, cars].map{|h| h.keys.sort_by{|k| h[k]}}.transpose.reverse.to_h 
# => {"Simon"=>"BMW", "John"=>"Audi", "Peter"=>"Volvo", "Jack"=>"Skoda"} 
+0

Com'on @sawa, он новичок в рубине .. не пугайте его этим кодом .. – Minato

+0

@Minato Хорошо, я добавил более читаемый. – sawa

0

Вы могли бы написать

def keys_sorted_by_decreasing_value(h) 
    h.sort_by(&:last).map(&:first).reverse 
end 

keys_sorted_by_decreasing_value(people).zip(keys_sorted_by_decreasing_value(cars)).to_h 
    #=> {"Simon"=>"BMW", "John"=>"Audi", "Peter"=>"Volvo", "Jack"=>"Skoda"} 

Рассмотрим расчеты в keys_sorted_by_decreasing_value:

h = people 
    #=> {"Jack"=>1500, "John"=>3000, "Peter"=>2500, "Simon"=>4000} 
a = h.sort_by(&:last) 
    #=> [["Jack", 1500], ["Peter", 2500], ["John", 3000], ["Simon", 4000]] 
b = a.map(&:first) 
    #=> ["Jack", "Peter", "John", "Simon"] 
c = b.reverse 
    #=> ["Simon", "John", "Peter", "Jack"] 

h = cars 
    #=> {"Audi"=>50000, "BMW"=>70000, "Skoda"=>30000, "Volvo"=>40000} 
a = h.sort_by(&:last) 
    #=> [["Skoda", 30000], ["Volvo", 40000], ["Audi", 50000], ["BMW", 70000]] 
b = a.map(&:first) 
    #=> ["Skoda", "Volvo", "Audi", "BMW"] 
d = c.reverse 
    #=> ["Jack", "Peter", "John", "Simon"] 

Затем мы вычисляем

e = c.zip(d) 
    #=> [["Simon", "Jack"], ["John", "Peter"], ["Peter", "John"], ["Jack", "Simon"]] 
e.to_h 
    #=> {"Simon"=>"Jack", "John"=>"Peter", "Peter"=>"John", "Jack"=>"Simon"} 
Смежные вопросы