gpt4 book ai didi

arrays - Ruby 数组排序 2 种不同的方式

转载 作者:数据小太阳 更新时间:2023-10-29 07:14:08 26 4
gpt4 key购买 nike

我有一个对象数组,我试图按多个条件对其进行排序。大多数比较只是通过做 <=>在他们的哈希值上,所以使用 sort_by速度非常快,但其中一个更复杂。

数组是足球队,目前排序如下:

teams.sort_by { |item| [item.points, item.goal_dif, item.goals] }

但是,如果最后 2 个团队在这 3 个字段上具有相同的值,我希望决胜局成为我创建的函数,a_beat_b(teamA, teamB) .

我尝试使用 Array.sort , 但与 sort_by 相比它非常慢对于前几个……我的实现是这样的:

teams.sort ( |a,b| [a.points, a.goals_dif, a.goals] <=> [b.points, b.goals_dif, b.goals])
与 sort_by 相比,它非常慢。 points、goals_dif 和 goals 的函数需要一些简单的查询,但如果它必须执行数百个,它就会陷入困境。

我不太擅长 Ruby,所以不确定将我的 a_beats_b 放在哪里在那里。 (如果A击败,平局或输给B,则分别返回1、0或-1)

最佳答案

I tried using Array.sort, but it's extremely slow compared to sort_by for those first few

这是因为 sort 多次调用给定的 block 。下面是一个展示幕后情况的示例:(按长度对 “apple”“pear”“fig” 进行排序)

def length(str)
puts "calculating #{str.inspect}.length"
str.length
end

array = %w{apple pear fig}
array.sort { |a, b| length(a) <=> length(b) }
#=> ["fig", "pear", "apple"]

length 方法的输出:

calculating "apple".length
calculating "pear".length
calculating "apple".length
calculating "fig".length
calculating "pear".length
calculating "fig".length

如您所见,length 在排序过程中被多次调用。想象一下,这些是数据库查询。

sort_by 另一方面,为每个元素调用一次 block ,构建内部映射:

array.sort_by { |a| length(a) }
#=> ["fig", "pear", "apple"]

输出:

calculating "apple".length
calculating "pear".length
calculating "fig".length

对于昂贵的操作(如数据库查询),这要快得多。但它也不太灵活——您不能再动态比较 ab

但是,您可以存储(昂贵的)操作的结果,例如通过使用散列:(这称为 memoization)

hash = Hash.new { |h, k| h[k] = length(k) }

并在 sort 中使用哈希:

array.sort { |a, b| hash[a] <=> hash[b] }
# calculating "apple".length
# calculating "pear".length
# calculating "fig".length
#=> ["fig", "pear", "apple"]

排序后,我们的哈希看起来像这样:

hash #=> {"apple"=>5, "pear"=>4, "fig"=>3}

应用于您的代码,像这样的东西应该可以工作:

hash = Hash.new { |h, k| h[k] = [k.points, k.goal_dif, k.goals] }
teams.sort { |a, b| hash[a] == hash[b] ? a_beats_b(a, b) : hash[a] <=> hash[b] }

关于arrays - Ruby 数组排序 2 种不同的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39374243/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com