- ベストアンサー
ソート順の配列に順位表示する
Perlで、大きいソート順になっている配列があります。 その中には重複しているデータもあります @list = (100,80,80, 50, 50, 45, 10, 0, 0, 0); のような配列を @ranking = (1,2,2, 4, 4, 6, 7,10,10,10); と順位を格納させたいです。 簡単な方法がありましたら、教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
@ranking がなぜそうなるのか説明してください. 特に最後の 10.
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
最後が 8 でいいなら @ranking = (1); for my $i (1 .. $#list) { push @ranking, ($list[$i-1] == $list[$i] ? $ranking[-1] : $i+1); } とか.
- toraneko75
- ベストアンサー率51% (27/52)
最後が8でいいなら・・ってことで作ってみました。 100 80 80 50 50 45 10 0 0 0から 1 2 2 4 4 6 7 8 8 8ができます。 #!/usr/bin/perl use strict; use warnings; my @ranking; my @list = ( 100, 80, 80, 50, 50, 45, 10, 0, 0, 0, ); my $max = $list[0]; my $i = 1; foreach my $num ( 0 .. $#list ) { if ( $max == $list[$num] ) { push @ranking, $i; } else { $i=$num+1; push @ranking, $i; $max = $list[$num]; } } print "@list\n"; print "@ranking\n"; exit;
- jjon-com
- ベストアンサー率61% (1599/2592)
@ranking = (1,2,2,4,4,6,7,8,8,8); という結果が正しく,10行程度のプログラムを組んだものでも質問者にとって「簡単な方法」に該当するなら,こんなコード例を挙げられます。 @list = (100,80,80,50,50,45,10,0,0,0); @ranking = (); $prev = $list[0] + 1; $i = 1; foreach $cur (@list) { if ($prev != $cur) { $order = $i; } push @ranking, $order; $prev = $cur; $i++; } print "@ranking";