5

オリンピックのメダル数を表示するウィジェットを作成しています。「country」オブジェクトのコレクションがあり、それぞれに「name」属性があり、メダル数には「gold」、「silver」、「bronze」があります。

リストは次のように並べ替える必要があります。1。最初にメダルの総数で並べ替える2.同じメダルの場合は、タイプで並べ替える(ゴールド>シルバー>ブロンズ、つまり2つのゴールド>1ゴールド+1シルバー)3。同じメダルとタイプの場合、サブ-アルファベット順に並べ替える

私はこれをルビーでやっていますが、言語は関係ないと思います。私は解決策を見つけましたが、それを行うにはもっとエレガントな方法があるはずだと感じたら。

これが私がしたことです:

  1. 加重メダルの合計を使用して仮想属性を作成します。したがって、2つの金と1つの銀がある場合、加重合計は「3.020100」になります。ゴールド1個とシルバー1個とブロンズ1個は「3.010101」になります

  2. メダル数を最初に最も高く並べ替えたいので、リストはDESCで並べ替えられます。しかし、その後、アルファベット順にサブソートします(つまり、ASC)。そこで、単語をアルファ反転する関数を作成しました(つまり、 "canada" => "xzmzwz")

  3. 加重合計を文字列に変換し、逆の名前(つまり、「3010101xzmzwz」)を連結してから、降順で並べ替えます。出来上がり。

今までに、誰かが約2行のコードで同じことを行う方法を理解しました。私を啓発する気ですか?

4

3 に答える 3

10
countries.sort_by do |country|
  medals = country.gold + country.silver + country.bronze
  [-medals, -country.gold, -country.silver, country.name]
end
于 2010-02-09T21:06:32.810 に答える
1

簡単な方法は、次のような任意の形式の文字列でsort_byを使用することです。

countries.sort_by do |c|
  "%010d-%010d-%010d-%s" % [ c.gold, c.silver, c.bronze, c.name ]
end

これは、獲得したメダルの数をおそらく法外な10の場所にパディングすることにより、すべての国をASCIIの並べ替え可能なリストに変換します。誰かが100億個以上のメダルを獲得した場合、プログラムが誤動作する可能性がありますが、それは合理的な制約のようです。

于 2010-02-09T22:44:10.400 に答える
0

Javaでは、オブジェクトに同等のものを実装すると、ArrayListまたはArrayで簡単に並べ替えることができます。Rubyには、2つの「国」オブジェクトを比較する方法を指示するメカニズムがありますか?

于 2010-02-10T04:10:14.517 に答える