Упростите код, который добавляет значение словаря с наибольшим количеством в массив - PullRequest
0 голосов
/ 04 июля 2018

У меня есть множество отдельных животных и множество соответствующих видов. Я хочу добавить более высокую оценку кошек и собак в мой массив соответствующих видов. Массив отдельных животных может не иметь запрошенных видов, и в этом случае kind_count возвращает {}.

species_count принимает множество животных и группирует их по видам. Пример:

animals = ['chihuaha', 'german_shepherd', 'golden_retriever', 'tabby cat', 'siamese cat'}
species_count(animals, DOG) = { species: 'dog', count: 3 }
species_count(animals, CAT) = { species: 'cat', count: 3 }
species_count(animals, MOUSE) = {}

Я думаю, что ниже можно улучшить. У Руби есть все виды магических методов, которые меня удивляют.

dogs = species_count(animals, DOG)
dog_count = dogs.fetch(:count, 0)
cats = species_count(animals, CAT)
cat_count = cats.fetch(:count, 0)

if dog_count >= cat_count && dog_count >= 3
    relevant_species << dogs
elsif cat_count >= 3
    relevant_species << cats
end

1 Ответ

0 голосов
/ 04 июля 2018

Что-то вроде этого, вероятно, будет способом сделать это:

Упрощенный код:

relevant_species = [DOG, CAT, MOUSE]
  .map { |animal| species_count(animals, animal) }
  .sort { |a, b| a[:count].to_i <=> b[:count].to_i }
  .last

ИЛИ шаг за шагом:

# returns array of [{ species: 'dog', count: 3 }, ... ]
species_counts = [DOG, CAT, MOUSE].map { |animal| species_count(animals, animal) }

# sorts the array based on the count value. to_i is to account for nils
sorted_species_counts = species_counts.sort { |a, b| a[:count].to_i <=> b[:count].to_i }

# returns the last element (with the highest count value) to be assigned to relevant species
relevant_species = sorted_species_counts.last
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...