今回は、前回学習した集合の概念を、Java言語で記述するとどうなるか具体的に取り組んでみましょう。手を動かすと、頭で考えているうちは見えてこなかった、解決すべき問題点が見えてくるものです。それらの問題点を解決していくことで、実際的なノウハウ・スキルが身に付いていきます。多少煩雑な演習問題ですが、じっくり取り組んでみてください。
問題:集合Aに対して、集合Bが真部分集合か、部分集合か、一致する要素がないか
を確認するプログラムを完成してください。
配列とArrayListでそれぞれ作成してみましょう。以下に判定部分のコードを除いたものを掲載します。目的の処理を行うコードを書き足してください。
解説
それぞれのプログラムの完成版を紹介します。この他により効果的なアルゴリズムが考えられるでしょうから、「より短く、わかりやすいコード」を目指して奮闘してみてください。
配列版もArrayList版もソースコードでは、集合Aと集合Bの要素を逐一比較し、一致する要素をカウントアップしています。ソースコードでは、配列版の13行目から22行目まで、ArrayList版の22行目から26行目までです。ArrayList版の要素チェック部分のコードがずいぶんシンプルであることに注目してください。
次の図34.1のように判定の基準を設けて処理しています。
この図34.1によれば、次のような条件式が考えられます。
真部分集合であるときの条件式は次の通り。
XOR(排他的論理和)をとりますから、要素数の比較は必要なくなりますので、解答例のソースコードには反映していません。
次に部分集合である場合。既に真部分集合である場合が除外されているとすると、あとは一致する集合の場合のみですから、次のような条件式になります。
こののちに、重複する要素の数がない場合、一部重複する集合の場合などを判定しています。実際のソースコードと見比べて、間違いなく判定されているかどうか確認してみてください。
今回はここまで
演習問題はいかがでしたか?解説に示したコードはシンプルなものですが、そこに至るためにはいくつか煩雑な論理の整理手続きを必要としました。文章で表していることをコードに移すというのは、意外と大変だということがご理解いただけたのではないでしょうか。