配列の重複要素を数える

Perl/CGIプログラム で使用する 配列 中の重複している要素(同じ内容の要素)を数える処理を作成してみましょう。

Perl/CGIプログラム で配列形式のデータを扱う場面というのはたくさんあります。

以前、「 Perl/CGIプログラムで配列の重複している要素を削除する 」ということをやりました。

今回はその続きみたいなものです。

  1. 配列重複要素のカウント
  2. 複数の配列重複要素をカウント

配列重複要素のカウント

それでは、配列の重複している要素(同じ内容の要素)をカウントするPerl/CGIプログラムを作成してみましょう。

#!/usr/bin/perl

use strict;

my @array = (1, 3, 3, 5, 7, 7, 7, 9, 9);
my $resulthashreference = &UniqueCountArray(\@array);

print "Content-type: text/html; charset=shift_jis\n\n";
foreach my $key (sort keys %{$resulthashreference}) {
print $key, 'は、', $resulthashreference->{$key}, "つあります。<br>\n";
}
exit;


sub UniqueCountArray {
my @arrayreference = @_;
my %hash = ();

foreach my $arraynumber (@arrayreference) {
foreach my $key (@{$arraynumber}) {
next if ($key eq '');
$hash{$key} += 1;
}
}

return \%hash;
}

__END__

このPerl/CGIプログラムを実行すると以下のように表示されます。

1は、1つあります。
3は、2つあります。
5は、1つあります。
7は、3つあります。
9は、2つあります。

Perl/CGIプログラム解説

メイン処理では、 サブルーチン UniqueCountArrayに重複要素をカウントしてほしい配列を リファレンス 形式で渡しています。

UniqueCountArray関数から返された値は、リファレンス形式の ハッシュ配列 になっており、キーは配列の各要素、値は重複要素を数えた結果となっています。

なので、返されたハッシュ配列のキーを基準にし、 foreach関数 sort関数 で順に値とともに表示させています。

UniqueCountArray関数というのは、以前使った UniqueArray関数 を改造したものです。

比較していただければわかるように、内容はほとんど変わっていません。

違うところは、ハッシュ配列の値部分を使って、渡された配列の各要素の重複をカウントしているというところです。

複数の配列重複要素をカウント

2つ以上の配列を比較し、重複している要素を数えてみましょう。

#!/usr/bin/perl

use strict;

my @array1 = (1, 3, 3, 5, 7, 7, 7, 9, 9);
my @array2 = (9, 9, 5, 7, 9, 5);
my $resulthashreference = &UniqueCountArray(\@array1, \@array2);

print "Content-type: text/html; charset=shift_jis\n\n";
foreach my $key (sort keys %{$resulthashreference}) {
print $key, 'は、', $resulthashreference->{$key}, "つあります。<br>\n";
}
exit;


sub UniqueCountArray {
my @arrayreference = @_;
my %hash = ();

foreach my $arraynumber (@arrayreference) {
foreach my $key (@{$arraynumber}) {
next if ($key eq '');
$hash{$key} += 1;
}
}

return \%hash;
}

__END__

このPerl/CGIプログラムを実行すると、以下のように表示されます。

1は、1つあります。
3は、2つあります。
5は、3つあります。
7は、4つあります。
9は、5つあります。

以前使用しました 配列の重複している要素を削除するUniqueArray関数 が複数の配列を処理できたように、このUniqueCountArray関数も複数の配列を処理できるようになっています。