Ruby - сортировка хэшей в порядке убывания по значению - PullRequest
1 голос
/ 20 марта 2019

Я пытаюсь решить следующее:

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

Примеры: {"Java" => 10, "Ruby" => 80, "Python" => 65} -> ["Ruby", "Python "]

{" Hindi "=> 60," Dutch "=> 93," Greek "=> 71} -> [" Dutch "," Greek "," Hindi "]

{"C ++" => 50, "ASM" => 10, "Haskell" => 20} -> []

У меня проблемы с сортировкой по убыванию результатов. Вот чтоПока что у меня есть

def my_languages(results)
array = []
results.each { |a,b| 
results.values.sort.reverse
if b.to_i >= 60
array << a
end
}
return array
end

Не самое элегантное решение, но я новичок в Ruby (и новичок в Stack Overflow тоже - извините!) Любой совет был бы очень признателен!

Ответы [ 3 ]

4 голосов
/ 20 марта 2019

Вы как бы смешиваете фазы сортировки и фильтрации.Мое решение

  1. Фильтр результатов с value >= 60
  2. Сортировка по значениям (по убыванию, -v)
  3. Извлечение первого элемента для каждого массива (название языка)

    def my_languages(results)
      results.select { |k, v| v >= 60 }.sort_by { |(k,v)| -v }.map(&:first)
    end
    
1 голос
/ 20 марта 2019
h = { "Java" => 10, "Ruby" => 80, "Python" => 65 }

h.select { |_,v| v >= 60 }.
  keys.
  sort_by { |k| -h[k] }
  #=> ["Ruby", "Python"] 

Шаги следующие.

g = h.select { |_,v| v >= 60 }
  #=> {"Ruby"=>80, "Python"=>65} 
a = g.keys
  #=> ["Ruby", "Python"] 
a.sort_by { |k| -h[k] }
  #=> ["Ruby", "Python"] 

Если вы не заботитесь о -h[k], следует два альтернативных варианта.

h.select { |_,v| v >= 60 }.
  keys.
  sort_by { |k| h[k] }.
  reverse

и

a = h.select { |_,v| v >= 60 }.
      keys
a.max_by(a.size) { |k| h[k] }

Я сомневаюсь, что можно заметить какое-либо существенное различие в производительности среди трех.

Enumerable # max_by , min_by, max и min разрешено иметь необязательный аргумент начиная с Ruby v2.2.

0 голосов
/ 21 марта 2019

Чтобы сделать это быстрее, я бы проверял минимальное значение при отображении:

hash = {"Hindi" => 60, "Dutch" => 93, "Greek" => 71}

hash.sort.map { |arr| arr[0] if arr[1] >= 60 }.compact

# or imo cleaner

hash.sort.select { |a| a[1] >= 60 }.map(&:first)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...