查找散列数组中的所有最大值,然后存储在单独的数组Ruby中

时间:2017-03-07 18:57:27

标签: arrays ruby

我是编程新手,并且正在使用Ruby来熟悉语法和控制流程。

我正在处理的程序要求我放置播放时间最长的DVD名称。这是我的代码:

dvds = [
  {
    :dvd_name=>"x-men",
    :dvd_playing_time=>549,
    :times_played=>9.0
  },
  {
    :dvd_name=>"Pi",
    :dvd_playing_time=>549,
    :times_played=>6.0
  }
]

两个哈希都有dvd_playing_time 549,因此我希望"x-men""Pi"都存储在数组中。我尝试了max_by,但它只返回一个dvd_name

dvds.max_by { |length| length[:dvd_playing_time]}[:dvd_name]

你能提供的任何帮助都很棒!

2 个答案:

答案 0 :(得分:3)

有三个步骤可以得到答案。

  • 确定最长的播放时间,Enumerable#map每个哈希hh[:dvd_length],然后获取这些值的Enumerable#max
  • 使用Hash#select选择h等于最长播放时间的哈希h[:dvd_length]
  • Enumerable#map哈希h,其最长播放时间为h[:dvd_name]

length_of_longest = dvds.map { |h| h[:dvd_length] }.max
  #=> 549
puts dvds.select { |h| h[:dvd_length] == length_of_longest }.map { |h| h[:dvd_name] }
  # x-men
  # Pi

答案 1 :(得分:1)

如果你想在一行中这样做:

dvds.group_by{ |dvd| dvd[:dvd_playing_time] }.max.last.map{ |dvd| dvd[:dvd_name] }

此代码按长度对dvds进行分组,获取具有最大长度的组,并将其映射为仅包含dvd名称。这不是最快的选择,因为它会在阵列中运行几次(技术上为n + g + m次)。

如果你担心速度:

max = 0
longest = []
dvds.each do |dvd|
  if dvd[:dvd_playing_time] > max
    max = dvd[:dvd_playing_time]
    longest = [dvd[:dvd_name]]
  elsif dvd[:dvd_playing_time] == max
    longest << dvd[:dvd_name]
  end
end

这种算法虽然不够优雅,但只需通过数组进行一次迭代就可以得到答案,这是你能做到的最好的。