2017-02-01 5 views
1

Например, если у меня есть хэш {"a" => 1, "b" => 2, "c" => 1}, я хочу ["a", "c"].Возвращает минимальные значения хеша с повторяющимися значениями

Я могу сделать hash.min_by{|k,v| v}, но это только возвращает первый матч ("a"=>1).

Как его получить, чтобы распознать дубликаты и вернуть {"a"=> 1, "c"=> 1}?

+0

Cf. http://stackoverflow.com/questions/22115956 – sawa

ответ

3
{"a" => 1, "b" => 2, "c" => 1}.group_by(&:last).min.last.map(&:first) 
# => ["a", "c"] 

или

{"a" => 1, "b" => 2, "c" => 1}.group_by(&:last).min.last.to_h.keys 
# => ["a", "c"] 
+1

... или 'h.group_by (&: last) .min.last.to_h # => {" a "=> 1," c "=> 1}' для предоставления результата в запрошенной форме. Читатели: обратите внимание, что 'min' применяется к парам ключ-значение (двухэлементные массивы) хэша, созданного' group_by'. –

7

Эта операция немного необычно для хэша, так что это не очень аккуратно:

min_value = hash.values.min 
min_pairs = hash.select { |k, v| v == min_value } 
1

Вы можете написать FORTRAN на любом языке! :)

Это имеет преимущество только требуя 1 проход:

hash = {"a" => 1, "b" => 2, "c" => 1} 

min = Float::INFINITY 
values_for_min = [] 

hash.each do |key, value| 
    case value <=> min 
    when 0 
    values_for_min << key 
    when -1 
    min = value 
    values_for_min = [key] 
    end 
end 

p min 
#=> 1 
p values_for_min 
#=> ["a", "c"] 
Смежные вопросы