2

DB に名前のリストがあり、アルファベット順に並べ替える必要があります。ただし、最初にギリシャ文字を表示し、次にラテン文字を表示する必要があります。たとえば、私は持っています:

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

次のように注文する必要があります。

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

どんな提案でも大歓迎です:)

4

2 に答える 2

1

私はirbで遊んでこれらの問題を解決するのが好きです。この解決策を見つける方法の 1 つを次に示します。まず、テスト配列を定義します。

>> 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"]
于 2012-04-24T07:21:20.570 に答える
0

上記の1つの解決策を示しました。もう1つのアプローチは、名前をギリシャ語とラテン語に分割し、それらのグループ内で並べ替えてから、2つの配列を1つにフラット化することです。

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

これは、他のソリューションよりも少しエレガントで理解しやすいかもしれませんが、柔軟性は劣ります。名前にラテン文字以外の文字が含まれている場合、つまりギリシャ語の場合のname !~ /\w+$ように返されることに注意してください。true

于 2012-04-24T07:25:28.183 に答える