Сортировка хешей хешей - PullRequest
       1

Сортировка хешей хешей

2 голосов
/ 21 января 2012

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

Вот пример того, с чем я имею дело:

hash = {"en"=> 
    { "key1"=> 
        {"foo1"=>1, 
         "foo2"=>2, 
         "foo3"=>1}, 
      "key2"=>
        {"foo4"=>1,
         "foo5"=>3, 
         "foo6"=>2, 
         "foo7"=>1}
    }
 "fr"=>
    ....
}

IЯ хочу набрать каждый основной ключ (т. е. «en», «fr», es ») и отсортировать по значениям для ключей внутри. Таким образом, имея« en »и« key1 »иметь« value2 »вверху с самым высокимчисло (частота). Затем делаю то же самое для остальной части хэша. Меня не беспокоит порядок клавиш "en", "fr" и т. д.

Поэтому я хочу, чтобы вывод был чем-токак это:

hash = {"en"=> 
    { "key1"=> 
        {"foo2"=>2, 
         "foo1"=>1, 
         "foo3"=>1}, 
      "key2"=>
        {"foo5"=>3,
         "foo6"=>2, 
         "foo4"=>1, 
         "foo7"=>1}
    }
 "fr"=>
    ....
}

1 Ответ

2 голосов
/ 21 января 2012

Хрупкий, но должен работать:

def sort_deep(h)
  if h.values.all?{ |o| o.is_a? Numeric }
    Hash[ h.sort_by{|k,v|[-v,k]} ]
  else
    Hash[ h.map{ |k,v| [ k, sort_deep(v) ] } ]
  end
end

Доказательство:

hash = {"en"=> 
    { "key1"=> 
        {"foo1"=>1, 
         "foo2"=>2, 
         "foo3"=>1}, 
      "key2"=>
        {"foo4"=>1,
         "foo5"=>3, 
         "foo6"=>2, 
         "foo7"=>1}
    },
 "fr"=>
    { "key1"=> 
        {"foo1"=>91, 
         "foo2"=>22, 
         "foo3"=>12}, 
      "key2"=>
        {"foo4"=>21,
         "foo5"=>31, 
         "foo6"=>27, 
         "foo7"=>11}
    }
}
require 'pp'
pp sort_deep(hash)
#=> {"en"=>
#=>   {"key1"=>{"foo2"=>2, "foo1"=>1, "foo3"=>1},
#=>    "key2"=>{"foo5"=>3, "foo6"=>2, "foo4"=>1, "foo7"=>1}},
#=>  "fr"=>
#=>   {"key1"=>{"foo1"=>91, "foo2"=>22, "foo3"=>12},
#=>    "key2"=>{"foo5"=>31, "foo6"=>27, "foo4"=>21, "foo7"=>11}}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...