我是编程新手,并且正在使用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]
你能提供的任何帮助都很棒!
答案 0 :(得分:3)
有三个步骤可以得到答案。
h
到h[:dvd_length]
,然后获取这些值的Enumerable#max。 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
这种算法虽然不够优雅,但只需通过数组进行一次迭代就可以得到答案,这是你能做到的最好的。