我的数据库中有一个名称列表,我需要按字母顺序对它们进行排序。但是,我需要先显示希腊字母,然后是拉丁字母。例如,我有:
[Jale, Βήτα, Άλφα, Ben]
我需要这样订购:
[Άλφα, Βήτα, Ben, Jale]
我们欢迎所有的建议 :)
我的数据库中有一个名称列表,我需要按字母顺序对它们进行排序。但是,我需要先显示希腊字母,然后是拉丁字母。例如,我有:
[Jale, Βήτα, Άλφα, Ben]
我需要这样订购:
[Άλφα, Βήτα, Ben, Jale]
我们欢迎所有的建议 :)
我喜欢通过在 irb 中玩耍来解决这些问题。这是您可以找到此解决方案的一种方法。首先,我们将定义我们的测试数组:
>> names = %w{Jale Βήτα Άλφα Ben}
=> ["Jale", "Βήτα", "Άλφα", "Ben"]
为了解决这个问题,让我们首先将数组转换为 2 元组,其中包含一个指示名称是否为希腊语的标志,然后是名称本身。我们希望标志是可排序的,所以我们首先要找到一个正则表达式匹配纯拉丁字符,并将其强制为字符串。
>> names.map{|name| [(name =~ /^\w+$/).to_s, name]}
=> [["0", "Jale"], ["", "Βήτα"], ["", "Άλφα"], ["0", "Ben"]]
然后我们将对 2 元组进行排序:
>> names.map{|name| [(name =~ /^\w+$/).to_s, name]}.sort
=> [["", "Άλφα"], ["", "Βήτα"], ["0", "Ben"], ["0", "Jale"]]
我们现在有一个排序顺序,首先是希腊名称,然后是拉丁名称。我们可以将其缩短为我们的解决方案:
>> names.sort_by{|name| [(name =~ /^\w+$/).to_s, name]}
=> ["Άλφα", "Βήτα", "Ben", "Jale"]
我在上面给出了一种解决方案。另一种方法是将名称划分为希腊语和拉丁语,然后在这些组中排序,然后将两个数组扁平化为一个:
>> names.partition{|name| name !~ /^\w+$/}.map(&:sort).flatten
=> ["Άλφα", "Βήτα", "Ben", "Jale"]
这可能比我的其他解决方案更优雅和更易于理解,但它不太灵活。请注意,如果名称包含非拉丁字符(即希腊语) ,name !~ /\w+$
则会返回类似的内容。true