gpt4 book ai didi

ruby - 按子数组中的三个项目排序

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

给定以下集合:

 collection = [
["Pennsylvania", "Bucks", "Doctor"],
["New Jersey", "Essex", "Lawyer"],
["New Jersey", "Essex", "Firefighter"],
["Florida", "Palm Beach", "Doctor"],
["Florida", "Broward", "Doctor"],
["Florida", "Palm Beach", "Scientist"]
]

我想按第一项升序、第二项升序和第三项升序排序。所以结果看起来像:

[
["Florida", "Broward", "Doctor"],
["Florida", "Palm Beach", "Doctor"],
["Florida", "Palm Beach", "Scientist"],
["Pennsylvania", "Bucks", "Doctor"],
["New Jersey", "Essex", "Firefighter"],
["New Jersey", "Essex", "Lawyer"],
]

我似乎无法通过使用 sort_by 迭代器来解决这个问题。我试过这个:

collection.sort_by {|a,b| a <=> b }
=> [["Florida", "Palm Beach", "Doctor"], ["Florida", "Palm Beach", "Doctor"], ["New Jersey", "Essex", "Firefighter"], ["New Jersey", "Essex", "Lawyer"], ["Florida", "Broward", "Scientist"], ["Pennsylvania", "Bucks", "Doctor"]]

显然不是我预期的结果。我做错了什么?

最佳答案

这里有两种工具,每一种都可以获得相同的结果,但在性能方面却有不同的结果。 sort_by 必须将每个项目一次且仅一次 以进行比较和排序。 sort 必须为每个比较 运行该 block ,其中每个排序操作通常会执行 N x log(N) 比较。对于可能比数组中的条目数多得多的操作的大型列表。

如果您正在进行昂贵的转换,sort_by 是这里的赢家。对于非常简单的操作,sort 有时更好,但这是一个主观的调用。

例如,两种方法得到相同的结果:

array = [ 7, 2, 5, 3, 4, 1, 6 ]

array.sort_by { |a| -a }
# => [7, 6, 5, 4, 3, 2, 1]

# Sort by negated values
array.sort { |a,b| -a <=> -b }
# => [7, 6, 5, 4, 3, 2, 1]

# Reverse the comparison, reverse the sort order
array.sort { |a,b| b <=> a }

所有这些都是有效的方法,但是当您像这样最小化代码时,sort_by 方法的优势会变得更加明显:

# Sort by unary minus (Integer#-@)
array.sort_by(&:-@)

在您的特定情况下,假设您想以不区分大小写的方式进行排序:

collection = [
["NEW JERSEY", "Essex", "Lawyer"],
["Florida", "Palm Beach", "Doctor"],
["New Jersey", "ESSEX", "Firefighter"],
["Pennsylvania", "Bucks", "Doctor"],
["florida", "Broward", "Doctor"],
["Florida", "Palm Beach", "Scientist"]
]

s = collection.sort_by do |e|
e.map(&:downcase)
end
# => [["florida", "Broward", "Doctor"], ["Florida", "Palm Beach", "Doctor"], ... ]

在数组上调用 downcase 是一个有点昂贵的操作,因此您希望尽可能少地调用它以避免创建大量需要进行垃圾回收的重复对象。

关于ruby - 按子数组中的三个项目排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53054135/

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