[英]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_time
为549
,因此我希望将"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 ,来确定最长的播放时间。 h
, h[:dvd_length]
等于最大播放时间。 Enumerable#map
具有最大播放时间的哈希h
Enumerable#map
到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
如果您想一行执行:
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.