特定の項目でソートする – Perl

  • このエントリーをはてなブックマークに追加
  • LINEで送る
この記事は 2006年10月4日 に書かれたものです

以下のような配列がある時、2番目の項目で並べ替えがしたい。 単純に sort @array しただけではできない。

@array = ( '1,b,c'
             , '3,c,b'
             , '2,a,a'
);

ソート項目が数値の時にはorderByArrayNum、文字列の時にはorderByArrayStrをそれぞれ呼び出せば良い。配列そのものの値が変わるので、オリジナルを保存しておきたい場合には、必ずコピーを渡すこと。

- Sponsored Link -

サンプル

;#
;#特定の項目でソートする
;#

use strict;

{
  my @array = ( '1,c,A'
         , '3,b,B'
         , '2,a,C'
  );

  #-- 並べ替え(文字列) --#
  orderByArrayStr(
        \@array    #対象配列
         , 1    #ソートするキー(0,1, ... n)
         , 'ASC'  #ASC:昇順、DESC:降順
  );

  print "$_\n" foreach( @array );
  print "\n";

  #-- 並べ替え(数値) --#
  orderByArrayNum(
        \@array    #対象配列
         , 0    #ソートするキー(0,1, ... n)
         , 'DESC'  #ASC:昇順、DESC:降順
  );

  print "$_\n" foreach( @array );
  print "\n";
}


#----------------------
#数値ソート
#----------------------
sub orderByArrayNum{
  my $data = shift;      #配列の参照
  my $key = shift || 0;    #ソートするキー
  my $set = shift || 'DESC';  #昇順or降順
  my @tmp = ();

  #-- 一時配列にキーを取り出す --#
  @tmp = map {(split /,/)[$key]} @$data;

  #-- ソート開始 --#
  if( $set eq 'ASC' ){
    @$data = @$data[sort {$tmp[$a] <=> $tmp[$b]} 0 .. $#tmp];
  }
  else{
    @$data = @$data[sort {$tmp[$b] <=> $tmp[$a]} 0 .. $#tmp];
  }

}


#----------------------
#文字列ソート
#----------------------
sub orderByArrayStr{
  my $data = shift;      #配列の参照
  my $key = shift || 0;    #ソートするキー
  my $set = shift || 'DESC';  #昇順or降順
  my @tmp = ();

  #-- 一時配列にキーを取り出す --#
  @tmp = map {(split /,/)[$key]} @$data;

  #-- ソート開始 --#
  if( $set eq 'ASC' ){
    @$data = @$data[sort {$tmp[$a] cmp $tmp[$b]} 0 .. $#tmp];
  }
  else{
    @$data = @$data[sort {$tmp[$b] cmp $tmp[$a]} 0 .. $#tmp];
  }

}

実行結果

2,a,C
3,b,B
1,c,A
3,b,B
2,a,C
1,c,A

参考

コメント

ご感想やご質問などお気軽にどうぞ。書き込むにはfacebookへのログインが必要です。

このブログを応援する

お寄せいただいたお気持ちは全額サーバ代や次の記事を執筆するための原資として活用させていただいております。この記事が参考になった場合などぜひご検討ください。

PayPal(ペイパル)
PayPalで300円支払う
※金額は任意で変更できます。
※100円でも泣いて喜びますw
※住所の入力欄が現れた場合は「no needed」を選択ください
これまでのご協力者さま
- Sponsored Link -