1

私は以下のような写真アルバムのリストを持っています:

"Day 10 - Kblah"
"Day 9 - Lblah"
"Day 8 - Sblah"
"Day 7 - Ublah"
"Day 6 - Sblah"
"Day 5 - Cblah"
"Day 4 - Gblah"
"Day 3 - Sblah"
"Day 2 - Dblah"
"Day 1 - Hblah"
"Another album"
"Some more albums"

タイトルで並べ替えると、次のようになります。

"Another album"
"Day 1 - Hblah"
"Day 10 - Kblah"
"Day 2 - Dblah"
"Day 3 - Sblah"
"Day 4 - Gblah"
"Day 5 - Cblah"
"Day 6 - Sblah"
"Day 7 - Ublah"
"Day 8 - Sblah"
"Day 9 - Lblah"
"Some more albums"

私が彼らになりたいところ:

"Another album"
"Day 1 - Hblah"
"Day 2 - Dblah"
"Day 3 - Sblah"
"Day 4 - Gblah"
"Day 5 - Cblah"
"Day 6 - Sblah"
"Day 7 - Ublah"
"Day 8 - Sblah"
"Day 9 - Lblah"
"Day 10 - Kblah"
"Some more albums"

基本的にはタイトルを自然順にしたいのですが、アルファベット順の自然順です。私のためにこれを正しく行うタイプの宝石はありますか?

よろしく、ニール

4

3 に答える 3

2

これを自動的に理解する宝石はありません。この問題を一般的に解決するのはかなり難しいと思います。

ただし、問題が一般的でない場合は、実行可能である可能性があります。

それは、ブロックをソートに渡すことから始まります。

array.sort do |a, b|
  # return -1, 0 or 1 in this block, usually done via the <=> operator
end

あなたは「日」の部分を残したいかもしれません:

DAY_REGEX = /^Day (\d+) -/

array.sort do |a, b|
  if is_day?(a) && is_day(b)
    value_of_day(a) <=> value_of_day(b)
  else
    a <=> b
  end
end

def is_day?(str)
  str =~ DAY_REGEX
end

def value_of_day(str)
  DAY_REGEX.match(str)[1].to_i
end

私は知っている、それはハッキーで醜いです。しかし、適切な解決策が見つからない場合は、それが自分でこれを解決する方法についてあなたに刺激を与えることを願っています。

編集:多分テクニックを変更して次のようなものを読んでください:contains_numbers。次のようなことを行うためのいくつかのテストを記述します。名前までの文字列の部分が両方の文字列で同じである場合、それらを削除し、数値を変換して、それで並べ替えます。

于 2012-05-22T22:31:56.530 に答える
1

フォトアルバム名のリストをどのように生成していますか?そのステップに戻って、そこでの並べ替えを理解できますか?(たとえば、ユーザーアルバムのDBテーブルから取得されていますか?)または、配列を並べ替え可能なものでインデックス付けされたアルバム名のハッシュに置き換えてから、キーを並べ替えて、ハッシュからこの順序で値を取得します。

于 2012-05-23T06:15:10.207 に答える
1

返信ありがとうございます。私はなんとか驚異的に機能する宝石を見つけることができました。これはNaturalSorterと呼ばれ、コントローラーの@albumsインスタンス変数で呼び出してタイトルで並べ替えた後、ビューに渡されました。

よろしく、ニール

于 2012-05-23T10:10:45.483 に答える