こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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という変数に格納させたいです。

投稿日時 - 2017-10-06 10:00:13

QNo.9382691

困ってます

質問者が選んだベストアンサー

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;
}
#=====ここまで=====================================

投稿日時 - 2017-10-06 11:15:44

お礼

前回に引き続き、わかりやすい丁寧な御回答
感謝感激です;;

実行したいことが無事できました。
本当にありがとうございました!!!

投稿日時 - 2017-10-07 15:15:27

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

変数$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] が分かりにくいかもしれませんが、呼び出し元から渡された点数が入っています。

投稿日時 - 2017-10-06 10:53:46

あなたにオススメの質問