DB に名前のリストがあり、アルファベット順に並べ替える必要があります。ただし、最初にギリシャ文字を表示し、次にラテン文字を表示する必要があります。たとえば、私は持っています:
[Jale, Βήτα, Άλφα, Ben]
次のように注文する必要があります。
[Άλφα, Βήτα, Ben, Jale]
どんな提案でも大歓迎です:)
DB に名前のリストがあり、アルファベット順に並べ替える必要があります。ただし、最初にギリシャ文字を表示し、次にラテン文字を表示する必要があります。たとえば、私は持っています:
[Jale, Βήτα, Άλφα, Ben]
次のように注文する必要があります。
[Άλφα, Βήτα, Ben, Jale]
どんな提案でも大歓迎です:)
私は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"]
上記の1つの解決策を示しました。もう1つのアプローチは、名前をギリシャ語とラテン語に分割し、それらのグループ内で並べ替えてから、2つの配列を1つにフラット化することです。
>> names.partition{|name| name !~ /^\w+$/}.map(&:sort).flatten
=> ["Άλφα", "Βήτα", "Ben", "Jale"]
これは、他のソリューションよりも少しエレガントで理解しやすいかもしれませんが、柔軟性は劣ります。名前にラテン文字以外の文字が含まれている場合、つまりギリシャ語の場合のname !~ /\w+$
ように返されることに注意してください。true