Вывод ключей максимального значения хеша в массивах в Ruby с использованием методов - PullRequest
0 голосов
/ 19 ноября 2018
data = [
  "Company one" => {
    "number_1" => 46,
    "number_2" => 3055,
    "country" => "USA"
      },
  "Company two" => {
    "number_1" => 32,
    "number_2" => 6610,
    "country" => "USA"
      },
 "Company three" => {
    "number_1" => 40,
    "number_2" => 9128,
    "country" => "USA"
     }
]

Итак, у меня есть этот массив, в котором я пытаюсь определить, какая из компаний имеет наибольшее число в «число_2». Самой крупной была бы Компания три с 9128.

Итак, у меня есть этот код, который ставит наибольшее число, которое будет 9128

 def number(data)
          collected_array=[]
          data.each do |company_hash|
           collected_array =  company_hash.map do |k,v|
                 v["number_2"]
             end
           end
         puts collected_array.max
         end
         number(data)

Но я пытаюсь указать название компании с наибольшим номером, которое будет "Компания три". Я пробовал .keys и другие способы, но это дает мне ошибку. Я пробовал так:

def number(data)
  collected_array=[]
  data.each do |company_hash|
   collected_array =  company_hash.map do |k,v|
         v["number_2"]
         k
     end
   end
 puts collected_array.max
 end
 number(data)

но это дает мне «Компанию два», а не «Компанию три», которая будет компанией с наибольшим числом

1 Ответ

0 голосов
/ 19 ноября 2018

Как заявляет @Cary, можно упростить доступ к первому элементу данных, а там, используя max_by, к локальной хеш-переменной, доступной в блоке, проверяющем значение ключа number_2.

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

data = [
  "Company one" => {
    "number_1" => 46,
    "number_2" => 3055,
    "country" => "USA"
  },
  "Company two" => {
    "number_1" => 32,
    "number_2" => 6610,
    "country" => "USA"
  },
  "Company three" => {
    "number_1" => 40,
    "number_2" => 9128,
    "country" => "USA"
  }
]

max_company = data.first.max_by { |_, h| h['number_2'] }

p max_company.first # "Company three"
p max_company.last['number_2'] # 9128
...