3

私はChallongeAPIを使用しており、トーナメントをクエリすると、各試合indentifier=はAZで返されます。最初の26が一致すると、識別子は次のようになりAA-AZますBA-BZ

単一のトーナメントの試合のリスト全体を取得.sort_byし、識別子で使用しようとすると、結果は次のように並べ替えられます。

A AA AB AC ... B BA BB BC ... C ...

一致を正しく表示するには、次の順序である必要があります。

A B C ... AA AB AC ... BA BB BC ...

私は検索に時間を費やしましたが、これを実現するための本当に簡単な方法を見つけることができませんでした。私が見つけたほとんどの投稿はファイル名や番号付けを扱っていましたが、この状況にどのように適用するのかよくわかりませんでした。

どんな助けでも大歓迎です!

編集

これはサンプル応答です:

[{"match":{"created_at":"2013-01-09T23:25:22-05:00","has_attachment":false,"id":8148294,"identifier":"CK","loser_id":null,"player1_id":null,"player1_is_prereq_match_loser":true,"player1_prereq_match_id":8148251,"player1_votes":null,"player2_id":null,"player2_is_prereq_match_loser":false,"player2_prereq_match_id":8148293,"player2_votes":null,"round":-9,"started_at":null,"state":"pending","tournament_id":320424,"updated_at":"2013-01-09T23:25:25-05:00","winner_id":null,"prerequisite_match_ids_csv":"8148251,8148293","scores_csv":""}}

あなたはそこに見ることができます"indentifier":"CK"。使用しているとき、.length私はを取得し続けundefined method 'length'ます。私が使用しているコントローラーで@tournamentlist = tournamentlist.matches.sort...

4

2 に答える 2

8

あるいは単に:

ids = ["AA", "A", "C", "CA", "CCC"]
ids.sort { |a,b| [a.length, a] <=> [b.length, b] }
#=> ["A", "C", "AA", "CA", "CCC"]

または、を使用してsort_by、さらに短くします。

ids.sort_by { |a| [a.length, a] }

参照:順序が異なる複数の条件で並べ替えるにはどうすればよいですか?

于 2013-01-11T05:17:47.547 に答える
3

簡単です。その配列をグループに分割します。各グループには同じ長さのID(1文字のID、2文字のIDなど)が含まれ、それらを個別に並べ替えてからマージします。

ids = %w[A B C AA AB AC BA BB BC AAB BBC CBA].shuffle
ids # => ["CBA", "BA", "C", "BC", "BB", "AC", "BBC", "AAB", "AA", "B", "AB", "A"]

sorted_ids = ids.group_by(&:length).sort{|(len1, _), (len2, _)| len1 <=> len2 }.map do |_, id_group|
  id_group.sort
end.flatten

sorted_ids # => ["A", "B", "C", "AA", "AB", "AC", "BA", "BB", "BC", "AAB", "BBC", "CBA"]

このコードを分解してみましょう:

.group_by(&:length)

これにより、元の配列とグループ文字列がその長さで処理され、各要素が2つの要素の配列でもある配列が生成されます。最初の要素は長さで、2番目の要素はこの長さの文字列の配列です。

.sort{|(len1, _), (len2, _)| len1 <=> len2 }

この部分では、IDグループをソートして、長さの昇順で表示されます(すべての1文字の文字列が最初に表示されます)。

.map {|_, id_group| id_group.sort }

すべての(length, strings)ペアを取り、文字列を並べ替えて戻ります。この呼び出しにより、配列の配列が生成されます。

.flatten

flattenネストされた配列を取得して「フラット化」し、ネストが発生しないようにします。

于 2013-01-11T05:09:59.430 に答える