- ベストアンサー
Perl ランク
いつもお世話になっております。 ご教示お願い致します。 for ($i=0;$i<=10;$i++){ 処理 $Tensu } があります これを、 書き込み処理すると 80 60 70 40 50 20 20 100 30 90 となります。 目的としては 80,3 60,5 70,4 40,7 50,6 20,9 20,9 100,1 30,8 90,2 このときに 順位も付与させたいのですが、 どのようにするのでしょうか? ※順位は $Rankという変数に格納させたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
No.1 です。 よくよく見返したら、$PrevPointの扱いが間違っていました。 正しくは次の通りです。 #=====ここから===================================== $PrevPoint = -1; for ($i=0;$i<=10;$i++) { 処理 push(@Points,$Tensu); } foreach $point (@Points) { $Rank = &sortPoint($point); print $point . "," . $Rank . "\n"; } sub sortPoint() { @lines = sort { $b <=> $a } @Points; $i = 0; $tmp = 0; foreach $line (@lines) { $i++; if ($line == $_[0]) { if ($line == $PrevPoint) { $tmp = $i--; } else { $tmp = $i; } $PrevPoint = $line; last; } } return $tmp; } #=====ここまで=====================================
その他の回答 (1)
- hok212
- ベストアンサー率66% (100/150)
変数$Tensuに20や90などの点数が入っているのなら、次の手法で出来ると思います。 # まずは配列@Pointsに点数を格納します for ($i=0;$i<=10;$i++) { 処理 push(@Points,$Tensu); } # 配列@Pointsをループ処理し、その都度 sortPoint ルーチンを呼び出す。 foreach $point (@Points) { $Rank = &sortPoint($point); print $point . "," . $Rank . "\n"; } # 配列@Pointsを降順で並び替え、その結果を配列@linesに格納 # $tmpが並び順の番号になるので、その値を呼び出し元に戻す sub sortPoint() { @lines = sort { $b <=> $a } @Points; $i = 0; $PrevPoint = -1; $tmp = 0; foreach $line (@lines) { $i++; if ($line == $_[0]) { if ($line == $PrevPoint) { $tmp = $i--; } else { $tmp = $i; } last; } } return $tmp; } $PrevPointの初期値を今回は「-1」に設定しましたが、ここは絶対にあり得ない数値を指定します。 点数なのでマイナス値はないだろうと仮定して -1 を設定しました。 sortPoint内の $_[0] が分かりにくいかもしれませんが、呼び出し元から渡された点数が入っています。
お礼
前回に引き続き、わかりやすい丁寧な御回答 感謝感激です;; 実行したいことが無事できました。 本当にありがとうございました!!!