ほげほげさん、こんばんは。
次のようなスクリプトで試してみました。動かしてみてください。少し書き直せ
ば使えると思います。
@a=(13, 18, 8, 9, 11, 20);
@b=(15, 9, 9, 18, 25);
@all = (@a,@b);
$eqc = 1;
foreach (sort{$a <=> $b}@all){
$nc{$_}++;$count++;
print $nc{$_},":",$count,":";
if($_ == $buffer){
$na{$_} += $count;
}else{
$na{$_} = $count;
}
print $na{$_},"\n";
$buffer = $_;
}
print "\n";
# @A
foreach (@a){
if($nc{$_} > 1){
print $na{$_}/$nc{$_},"\n";
}else{
print $na{$_},"\n";
}
}
print "\n";
# @B
foreach (@b){
if($nc{$_} > 1){
print $na{$_}/$nc{$_},"\n";
}else{
print $na{$_},"\n";
}
}
On Wed, 5 Oct 2005 18:40:58 +0900 (JST)
BYX06175@... (ほげほげ) さんwrote:
> こんにちは。ほげほげと申します。
> ソートを使った処理で悩んでいます。
>
> 2つの数値が入った配列を、値の小さい順に番号を割り当て
> その番号が入った配列を得たいのです。
> ただし、同じ数値があった場合には、平均値を割り当てます。
>
> たとえば、
> @a=(13, 18, 8, 9, 11, 20);
> @b=(15, 9, 9, 18, 25);
> ならば、ソートすると
> 8, 9, 9, 9, 11, 13, 15, 18, 18, 20, 25
> なので、
> 1, 3, 3, 3, 5, 6, 7, 8.5, 8.5, 10, 11
> (9と18は複数あるので順番の平均値(2+3+4)/3=3と
> (8+9)/2=8.5を割り当てる)
>
> この順番から元の配列に値を対応させて2つの配列、
> @A=(6, 8.5, 1, 3, 5, 10);
> @B=(7, 3, 3, 8.5, 11);
> を得たいのです。
>
> 単純な並び替えなら、シュウォーツ変換を使えそうな気がしたのですが、
> 同値があったときの処理で困ってしまいました。
> 平均値を得る関数&meanがあるとして、どのようなスクリプトを書けばよいでしょうか?
>
> よろしくお願いします。
>
>
藤岡 和夫
kazuf@...
TS Networkのために http://homepage1.nifty.com/kazuf/