Perlで複数(3個以上)の配列の共通要素を調べる方法を教えてください。

@a = (1,2,3,4,5);
@b = (1,5,6,8);
@c = (2,4,5);
@d = (1,2,3,5);
で5が出てくるようにするにはどうすればいいでしょうか。

回答の条件
  • 1人2回まで
  • 登録:2008/09/03 11:37:52
  • 終了:2008/09/03 17:30:02

ベストアンサー

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012008/09/03 16:15:57

ポイント100pt
# データ準備
@a = (1,2,3,4,5);
@b = (1,5,6,8);
@c = (2,4,5);
@d = (1,2,3,5);

# データ毎の個数を数える
%h;
foreach $k((@a,@b,@c,@d)) {
   $h{$k} => $h{$k}++;
}

# 配列がaからdの四つなので個数が4のものを表示
while(($k,$v) = each%h) {
   if($v == 4) {
      print "$k\n";
   }
}

Windows版でのみ動作確認しております。

id:peppon

おーありがとうございまっす!!

2008/09/03 17:29:40
  • id:m_nagase
    例題のこのデータに対してならうまく行くけど、例えば@a=(1,2,3,4,5,1)とかだったら1と5になるし、@a=(1,2,3,4,5,5)だったら答えはなしになりますね。
  • id:GoldenDawn
    配列の数がいくつでも使えるようにサブルーチンで一般化。
    ついでに要素のユニーク化も入れた。
    呼び出すときは配列のリファレンスを渡すのに注意。

    my @a = (1,2,3,4,5) ;
    my @b = (1,5,6,8) ;
    my @c = (2,4,5) ;
    my @d = (1,2,3,5) ;

    sub product {
    my %cnt ;
    foreach (@_) {
    my %tmp ;
    my @unq = grep(!$tmp{$_}++, @$_) ;

    $cnt{$_}++ foreach (@unq) ;
    }

    my @ret ;
    while (($k, $v) = each %cnt) {
    push @ret, $k if ($v == ($#_ + 1)) ;
    }
    @ret ;
    }

    my @ab = product \@a, \@b ;
    my @acd = product \@a, \@c, \@d ;
    my @abcd = product \@a, \@b, \@c, \@d ;
    print << "EOS" ;
    @ab
    @acd
    @abcd
    EOS

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません