繁体   English   中英

在哈希数组中查找所有最大值,然后将其存储在单独的数组中

[英]Find all max values in an array of hashes and then store in a separate array 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_time549 ,因此我希望将"x-men" dvd_playing_time "x-men""Pi"存储在数组中。 我尝试了max_by ,但它只返回一个dvd_name

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

您可以提供的任何帮助都很棒!

可以通过三个步骤获得答案。

  • 通过将每个哈希h 映射h[:dvd_length] ,然后取这些值的Enumerable#max ,来确定最长的播放时间。
  • 使用Hash#select选择哈希值hh[:dvd_length]等于最大播放时间。
  • Enumerable#map具有最大播放时间的哈希h Enumerable#maph[: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

如果您想一行执行:

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

此代码按长度对dvd进行分组,采用最大长度进行分组,并将其映射为仅包含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

这种算法虽然不怎么精巧,但却可以通过数组的一次迭代为您提供答案,这是您可以做的最好的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM