gpt4 book ai didi

ruby-on-rails - 在 Ruby/Rails 中使用特定排序规则对值进行排序

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

是否可以使用 Ruby 中的特定排序规则对值数组进行排序?我需要根据 da_DK 排序规则进行排序。

给定数组 %w(Aarhus Aalborg Assens) 我想要 ['Assens', 'Aalborg', 'Aarhus'] 返回正确的用丹麦语订购。

标准排序方法

%w(Aarhus Aalborg Assens).sort

返回一些看起来像 ascii 顺序的东西(至少不是丹麦顺序):

["Aalborg", "Aarhus", "Assens"]

环境是 Snow Leopard 和运行 ruby​​ 1.9.2 和 Rails 3.0.5 的 linux。

最佳答案

根据 Wikipedia :

In the Danish and Norwegian alphabets, the same extra vowels as in Swedish (see below) are also present but in a different order and with different glyphs (..., X, Y, Z, Æ, Ø, Å). Also, "Aa" collates as an equivalent to "Å". The Danish alphabet has traditionally seen "W" as a variant of "V", but today "W" is considered a separate letter."

这会影响排序。

执行此操作以解决问题:

names = %w(Aarhus Aalborg Assens)
names.sort_by { |w| w.gsub('Aa', 'Å') } # => ["Assens", "Aalborg", "Aarhus"]

对于具有复合字符组合以转换为单个字符的其他字母,还有类似的东西。

这样做的原因是 sort_by 做了一个 Schwartzian Transformation ,因此它实际上是按 block 返回的返回值排序,在本例中,返回值是用“Å”替换了“Aa”的名称。替换是临时的,并在数组排序时丢弃。

sort_by 非常强大,但确实有一些开销。对于简单的排序,您应该使用 sort 因为它更快。对于在对象的顶层比较两个简单值的排序,那么使用 sort 还是 sort_by 就成了一个问题。如果您必须进行更复杂的计算或在对象中四处挖掘,那么 sort_by 可以证明更快。并没有真正一成不变的方法可以知道哪个更好,所以如果您必须对大型数组进行排序或处理对象,我强烈建议使用基准进行测试,因为差异可能很大,有时 sort 可能是更好的选择。

编辑:

Ruby 本身不会做你想做的事,因为它不知道那里设置的每个字符的排序顺序。有一个 discussion关于合并IBM's ICU这解释了为什么会这样。如果你想要 ICU 的能力,你可以查看 ICU4R .我没有玩过它,但它听起来像是你在 Ruby 中唯一真正的解决方案。

您也许可以使用像 Postgres 这样的数据库来做一些事情。它们支持各种排序选项,但通常会强制您在创建数据库时声明排序规则……或者可能是在创建表时……自从我创建新表以来已经有一段时间了。无论如何,这是一种选择,尽管这会很痛苦。

关于ruby-on-rails - 在 Ruby/Rails 中使用特定排序规则对值进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5465706/

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