2

クラス変数 'wins' と 'losses' を持つクラス Team を考えてみましょう。次のように、チームの配列を勝敗比で並べ替えたいと考えています。

5:0 > 3:0 > 1:0 > 3:1 > 5:5 > 3:3 > 1:3 > 0:1 > 0:3 > 0:5

私はすでに (部分的に) 一緒にハッキングされた解決策を持っていますが、これには満足していません。この問題を解決するための、よりクリーンでエレガントでシンプルな方法があるかどうか疑問に思っています。

def ratio
    if @losses == 0 then 
        return 1000000+@wins
    end
    if @wins == 0 then
        return 0-@losses
    end
    return @wins/@losses
end

(これは 5:5 > 3:3 を修正しません)

これは Team クラスにあり、次のように使用できます。

teams.sort! { |a, b| b.ratio <=> a.ratio }

これを解決する最も簡単な方法は何ですか? (ソリューションは Ruby である必要はありません。OO であれば何でも構いません)

4

7 に答える 7

3

私は Ruby を話せませんが、希望する結果をもたらす Python のアプローチでは、キーにタプルを使用します (decorate-sort-undecorate の「シュワルツ変換」イディオム)。

たとえば、勝率、次に勝った数、次に (負の) 負けた数でランク付けできます。これにより、希望する順序が得られます。

>>> wl = [[3, 0], [3, 1], [0, 5], [3, 3], [0, 3], [5, 5], [1, 3], [5, 0]]
>>> 
>>> def rank(wl):
...     win, loss = wl
...     return (1.0*win/(win+loss) if win+loss > 0 else 0), win, -loss
... 
>>> sorted(wl, key=rank)
[[0, 5], [0, 3], [1, 3], [3, 3], [5, 5], [3, 1], [3, 0], [5, 0]]
>>> sorted(wl, key=rank)[::-1]
[[5, 0], [3, 0], [3, 1], [5, 5], [3, 3], [1, 3], [0, 3], [0, 5]]

残念ながらRubyに相当するものが何であるかはわかりませんが、sort_byどこかにメソッドが浮かんでいるようです。

于 2013-01-25T21:23:59.690 に答える
2

で使用するメソッドを定義する代わりに、比較を処理するようにsort_byオーバーライドしない<=>でください。そうすれば、数値の作成を回避し、代わりに次のようなことを行うことができます

def <=>(other)
  if losses == 0
    -1
  elsif other.losses == 0
    1
  else
    # do ratio logic here
  end
end
于 2013-01-25T21:08:20.030 に答える
1

各チームの勝率を設定し、それを並べ替えます。各勝率内で、プレイしたゲームの合計で並べ替える必要があります。チームの全体的な勝率が50%未満かそれ以上かによって、ゲームの合計が良いか悪いかを判断してください。

于 2013-01-25T21:04:11.210 に答える
1
(@wins * 3 + 1) / (@losses * 3 + 2)

5:0 8.00
3:0 5.00
3:1 2.00
5:5 0.94
3:3 0.91
1:3 0.36
0:3 0.09
0:5 0.06
于 2013-01-25T21:07:41.150 に答える
0

上記のコメントに基づいて、ソート可能な単一の数値がうまく機能することに同意します。おそらく次のようなものです:

def win_loss_ranking
  (@wins *2 ) - (@losses * 2) + (@wins + @losses)
end

これにより、プレイしたゲームと勝敗を考慮した数値が得られます。したがって、5:5 と 3:3 がある場合、5:5 の win_loss_ranking は 10 になり、3:3 チームの win_loss_ranking は 6 になります。

于 2013-01-25T21:10:11.320 に答える
0

Ratio (目的に関連する意味で) は、differenceに関して単調に増加します。違いを使って実装してみませんか?

class Team
  def difference; @wins - @losses end
end

teams.sort!{|a, b| a.difference <=> b.difference}
于 2013-01-25T21:56:28.843 に答える