Perlで2つの配列を比較し、重複する要素の数をカウントする処理を書いてみた
「6月に来店したお客様のうち、7月に何名の方がリピートしてくださったか?」といった数字を拾いたい事象が発生。6月の来店済み顧客IDの配列と7月の来店済み顧客IDの配列を比較して重複分を拾えばいいじゃない!ということで、書きました。foreachを2重にするのは、「なんか違う」と思って調べたら、こんな感じに仕上がりました。
#!/usr/bin/env perl use strict; use warnings; use Test::More tests => 1; # 2つの配列のうち重複する要素の数を取得 # @param array_ref $array_a_ref 比較したい配列1 # @param array_ref $array_b_ref 比較したい配列2 # @return int $result_count 重複する要素数 sub get_duplicate_count { my ($array_a_ref, $array_b_ref) = @_; my %count; my @result; # 2つの配列の要素を、要素をキーにしたハッシュに格納 $count{$_}++ for (@$array_a_ref, @$array_b_ref); # 要素数が2以上のもの(重複するやつ)のみ抽出 @result = grep {$count{$_} >= 2} keys %count; my $result_count = @result; return $result_count; } my @arr_a = qw(1 2 3 4 5 6 7 8 9 10); my @arr_b = qw(2 4 6 8 10); is(get_duplicate_count(\@arr_a, \@arr_b), 5, 'test count duplicate');
先日、Javaを書いてて「配列の要素の重複を消したい」ってなりました。で、Listで作ったコレクションをSetインターフェースに変換するだけで重複が消えたときは、「魔法かよ」って思った。プログラミング言語によって色々とやり方のバリエーションがあるんだなぁ、と実感。
静的型付け言語と関数型言語を、掘り下げてみたいという欲求が上がった。