我在我的數據庫中有一個名稱列表,我需要按字母順序對它們進行排序。但是,我需要首先顯示希臘字母,然後顯示拉丁字母。例如,我有:Rails先訂購希臘字符
[Jale, Βήτα, Άλφα, Ben]
,我需要訂購這樣的:
[Άλφα, Βήτα, Ben, Jale]
任何建議,將不勝感激:)
我在我的數據庫中有一個名稱列表,我需要按字母順序對它們進行排序。但是,我需要首先顯示希臘字母,然後顯示拉丁字母。例如,我有:Rails先訂購希臘字符
[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
的名稱,如果該名稱具有非拉丁字符,即希臘語。
據我瞭解你自動訂單不工作?所以也許你可以通過拉丁和希臘語將原始數據分離/排序/拆分成兩個數組,然後自動排序這兩個數組,然後將它們再次組合在一起? – 2012-04-24 07:06:20
默認情況下,自動訂單首先顯示拉丁文,然後顯示希臘字母。你提出的建議聽起來不錯 – kamperone 2012-04-24 07:08:18
問題:自動訂單在每個字母上都有自己的工作嗎?我的意思是,希臘人在最後,但在希臘人的裏面,一切都是正確的?然後,我建議自動排序,經過排序的數組,然後用第一個希臘字母來代替,然後在開始時把它作爲新數組,然後放入拉丁文的東西 – 2012-04-24 07:13:16