2013年2月19日火曜日

複数条件でソート

ソートは複数の条件を指定することができます。


%dic=();
$dic{'a'} = 0;
$dic{'b'} = 1;
$dic{'c'} = 2;
$dic{'d'} = 0;
$dic{'e'} = 2;
$dic{'f'} = 3;
$dic{'g'} = 0;

# 複数条件でソート
@sorted_keys = sort {$dic{$b} <=> $dic{$a} or $b cmp $a} keys %dic;                                        

foreach $key(@sorted_keys) {
    print "$key:$dic{$key}\n";
}


上の例では、ハッシュの値の降順にソートし、値が同じ場合はハッシュのキーの降順でソートする例です。

結果は以下のようになります。

f:3
e:2
c:2
b:1
g:0
d:0
a:0


orの左側に第一条件を指定し、もし第一条件が同じ値だった場合、次の条件をorの右側に指定します。条件が2つより多い場合は、更にorを続けて3番めの条件、4番めの条件、・・・というように続けることができます。

あまり条件が長くなると1行に書くのが分かりづらくなるようであれば、以下のようにソート条件を関数化することもできます。



%dic=();
$dic{'a'} = 0;
$dic{'b'} = 1;
$dic{'c'} = 2;
$dic{'d'} = 0;
$dic{'e'} = 2;
$dic{'f'} = 3;
$dic{'g'} = 0;

# ソート条件を関数呼び出しで
@sorted_keys = sort sort_routine keys %dic;

foreach $key(@sorted_keys) {
    print "$key:$dic{$key}\n";
}

sub sort_routine
{
    $dic{$b} <=> $dic{$a}
    or
    $b cmp $a
    or
    # もっといろんな条件
}







0 件のコメント:

コメントを投稿