2014-10-07 4 views
0

рассмотрим хэшкак сортировать хэш с обоими ключами и значениями

my_hash = {"drsn"=>["on", "tw", "th"], "mhsh"=>["tw", "th", "fo"], "achu"=>["th", "fo", "fi"]} 

я могу сортировать хэш по

Hash[my_hash.sort] 

, что приводит к отсортированного хэш как

{"achu"=>["th", "fo", "fi"], "drsn"=>["on", "tw", "th"], "mhsh"=>["tw", "th", "fo"]} 

но может ли кто-нибудь сказать мне, как сортировать значения также вместе с ключом?

как

{"achu"=>["fi", "fo", "th"], "drsn"=>["on", "th", "tw"], "mhsh"=>["fo", "th", "tw"]} 

Я использую рубин 2.0.0

я попытался sort_by также как

Hash[my_hash.sort_by {|k,v| v.sort}] 

но получил

{"achu"=>["th", "fo", "fi"], "mhsh"=>["tw", "th", "fo"], "drsn"=>["on", "tw", "th"]} 
+1

Ваши примерные значения вводят в заблуждение. – Stefan

+0

@Stefan, можете ли вы рассказать мне, где вы нашли трудным? я изменю свой вопрос – Aparichith

+1

'[" three "," four "," five "]' unsorted и '[" five "," four "," three "]' сортируется, что выглядит странно. – Stefan

ответ

1

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

Это сортирует хэш, то для каждого из его ключей/значений, сортирует значения:

Hash[my_hash.sort.map { |a,b| [a, b.sort] }] 
+0

Спасибо @meagar. Можете ли вы объяснить мне, почему Hash [my_hash.sort_by {| k, v | v.sort}] не сортировался с массивом? – Aparichith

+0

Потому что вы сортируете суб-массивы, но не храните их в любом месте. 'sort_by' ничего не делает со значениями, которые вы передаете, кроме * sort by * them. Исходные значения остаются внутри 'my_hash'. Моя версия перезаписывает их с их отсортированной версией. – meagar

1

Ваша формулировка вводит в заблуждение. Вы пытаетесь сделать две разные вещи. Сортировка хэш по ключу (и значение в случае, если ключ является связь) осуществляется:

Hash[my_hash.sort] 

Сортировка каждое значение выполняется:

my_hash.each{|_, v| v.sort!} 

Здесь sort! используется для изменения значения, которые являются массивами.

+0

Можете ли вы дать пояснение вместе с ответом? это действительно помогает мне, как новичкам. – Aparichith