ソート条件が二つある時にソートするには

[上に] [前に] [次に]
ペンタ 2000/05/26(金) 10:24:19
ソート条件が二つある時のソート方法でなやんでいます。
やりたい事は、ゲームをした後に結果を高得点順にソート
させるのですが、同じ点数の人がいた時は、その点数内で
また、ソートしてゲームをやった順に同点者を表示させます。

データの形式はcsv形式で

シーケンス,名前,日付,点数,メッセージ,

です。シーケンスがゲームを行った順番になります。
シーケンスは順番に1,2,3と数値が入っていきます。
点数だけでしたら、
@dataarray = sort{(split(/\,/,$b))[3] <=> (split(/\,/,$a))[3]}@dataarray;
でソートできるのですが、これに同点の時はゲームをした順に
表示させる条件を追加するにはどのようにしたらよろしいでしょうか?

よろしく、お願いいたします。

S-pore [HomePage] 2000/05/26(金) 10:37:39
@dataarray = sort { (split(/\,/, $b))[3] <=> (split(/\,/, $a))[3] || $a <=> $b } @dataarray;

「シーケンス」が行頭にあるのでたぶんこれでOKだと思います。(ちょっと卑怯技?)

ペンタ 2000/05/26(金) 11:03:08
S-poreさんありがとうございます。解決しました。
質問があります。|| はどのように関係してるのでしょうか?
教えて頂いた上に質問までしてずうずうしいのですが、
もし、よろしければ教えて頂けますでしょうか。

よろしく、お願いいたします。

S-pore [HomePage] 2000/05/26(金) 11:17:51
(split(/\,/, $b))[3] <=> (split(/\,/, $a))[3]
の判定結果が 0 のとき(つまり点数が等しいとき)は,
|| 以下の $a <=> $b が判定され,この比較結果によってソートされます。
追試みたいな感じでしょうか。(謎)

ちなみに,
$a <=> $b
は,
(split(/\,/, $a))[0] <=> (split(/\,/, $b))[0]
と同じことです。(念のため)

ペンタ 2000/05/26(金) 11:30:18
[[解決]]
S-poreさんわかりました。
本当に、ありがとうございました。

[上に] [前に] [次に]