作者: 藤岡和夫
日時: 2005/10/05(23:23)
ほげほげさん、こんばんは。

次のようなスクリプトで試してみました。動かしてみてください。少し書き直せ
ば使えると思います。

@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/