2012-04-24 75 views
2

我在我的數據庫中有一個名稱列表,我需要按字母順序對它們進行排序。但是,我需要首先顯示希臘字母,然後顯示拉丁字母。例如,我有:Rails先訂購希臘字符

[Jale, Βήτα, Άλφα, Ben] 

,我需要訂購這樣的:

[Άλφα, Βήτα, Ben, Jale] 

任何建議,將不勝感激:)

+0

據我瞭解你自動訂單不工作?所以也許你可以通過拉丁和希臘語將原始數據分離/排序/拆分成兩個數組,然後自動排序這兩個數組,然後將它們再次組合在一起? – 2012-04-24 07:06:20

+0

默認情況下,自動訂單首先顯示拉丁文,然後顯示希臘字母。你提出的建議聽起來不錯 – kamperone 2012-04-24 07:08:18

+0

問題:自動訂單在每個字母上都有自己的工作嗎?我的意思是,希臘人在最後,但在希臘人的裏面,一切都是正確的?然後,我建議自動排序,經過排序的數組,然後用第一個希臘字母來代替,然後在開始時把它作爲新數組,然後放入拉丁文的東西 – 2012-04-24 07:13:16

回答

1

我喜歡玩弄解決這些問題在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"] 
+0

這是偉大的彼得。就像我說過的,我並不熟練,而且我的名字叫@names。我該如何申請? – kamperone 2012-04-24 07:32:11

+0

'@ names.map(&:name).sort_by {...' – Peter 2012-04-24 07:37:12

0

我給出了上面的一個解決方案。另一種方法是分區名稱爲希臘語和拉丁語,然後排序中的那些羣體,然後壓平兩個數組合併爲一個:

>> names.partition{|name| name !~ /^\w+$/}.map(&:sort).flatten 
=> ["Άλφα", "Βήτα", "Ben", "Jale"] 

這可能是有點比我的其他解決方案更優雅和可以理解的,但它是不太靈活。請注意,name !~ /\w+$將返回類似true的名稱,如果該名稱具有非拉丁字符,即希臘語。