はじめMath! Javaでコンピュータ数学

第34回 集合の数学 部分集合,空集合 [後編]

この記事を読むのに必要な時間:およそ 3 分

次に部分集合である場合。既に真部分集合である場合が除外されているとすると,あとは一致する集合の場合のみですから,次のような条件式になります。

こののちに,重複する要素の数がない場合,一部重複する集合の場合などを判定しています。実際のソースコードと見比べて,間違いなく判定されているかどうか確認してみてください。

ソースコード:HairetsuDeBubunShugoHantei.javaの完成版

01: //サンプルコード
02: //部分集合・真部分集合の判定
03: //filename : HairetsuDeBubunShugoHantei.java
04: 
05: class HairetsuDeBubunShugoHantei {
06:   public static void main(String[] args) {
07:     char a[] = {’a’,’b’,’c’,’d’,’e’};
08: // char b[] = {’b’,’d’,’a’,’c’,’e’}; //部分集合,かつ等価な集合
09:     char b[] = {’a’,’b’,’c’}; //真部分集合
10: // char b[] = {’a’,’b’,’c’,’f’}; //重複部分のある集合
11: // char b[] = {’x’,’y’,’z’}; //一致する部分のない集合
12: 
13:     //A とB の関係確認
14:     int match = 0;
15:     for( int i = 0;i<a.length;i++){
16:       for( int j = 0;j<b.length;j++){
17:         if (a[i] == b[j]){
18:           ++match;
19:           break;
20:         }
21:       }
22:     }
23:     //結果表示
24:     if (match == a.length ^ match == b.length){
25:       System.out.println("真部分集合です。");
26:     } else if (a.length == b.length && match == a.length) {
27:       System.out.println("部分集合です。");
28:     } else if (match == 0) {
29:       System.out.println("一致する要素はありません。");
30:     } else
31:       System.out.println("重複部分のある集合です。");
32: 
33:   }// end of main
34: }// end of class HairetsuDeBubunShugoHantei

ソースコード:ArrayListDeBubunShugoHantei.javaの完成版

01: //サンプルコード
02: //部分集合・真部分集合の判定ArrayList 版
03: //filename : ArrayListDeBubunShugoHantei.java
04: import java.util.ArrayList;
05: 
06: class ArrayListDeBubunShugoHantei {
07:  public static void main(String[] args) {
08: 
09:     //初期化
10:     ArrayList A = new ArrayList(); //集合A
11:     char a[] = {’a’,’b’,’c’,’d’,’e’};
12:     for (int i = 0 ; i < a.length ; ++i )
13:         A.add( Character.toString(a[i]) );
14:     ArrayList B = new ArrayList();//集合B
15: // char b[] = {’b’,’d’,’a’,’c’,’e’}; //部分集合,かつ等価な集合
16:     char b[] = {’a’,’b’,’c’}; //真部分集合
17: // char b[] = {’a’,’b’,’c’,’f’}; //重複部分のある集合
18: // char b[] = {’x’,’y’,’z’}; //一致する部分のない集合
19:      for (int i = 0 ; i < b.length ; ++i )
20:          B.add( Character.toString(b[i]) );
21: 
22:     //A とB の関係確認
23:     int match = 0;
24:     //一致する要素の数をカウントする
25:     for (int i = 0 ; i < B.size() ; ++i )
26:       if ( A.contains( B.get(i) ) == true ) ++match;
27:     //結果の表示
28:     if (match == A.size() ^ match == B.size()){ // 真部分集合
29:       System.out.println("真部分集合です。");
30:     } else if (match == A.size() && A.size() == B.size() ) {
31:       System.out.println("部分集合です(等しい集合です)。");
32:     } else if (match == 0){
33:       System.out.println("一致する要素はありません。");
34:      } else
35:        System.out.println("重複部分のある集合です。");
36: 
37:   }// end of main
38: }// end of class ArrayListDeBubunShugoHantei

今回はここまで

演習問題はいかがでしたか?解説に示したコードはシンプルなものですが,そこに至るためにはいくつか煩雑な論理の整理手続きを必要としました。文章で表していることをコードに移すというのは,意外と大変だということがご理解いただけたのではないでしょうか。

今回のまとめ

  • 問題を解く場合に,文章をいったん図に表現するとよいでしょう。
  • ArrayListは大変便利です。

著者プロフィール

平田敦(ひらたあつし)

地方都市の公立工業高等学校教諭。趣味はプログラミングと日本の端っこ踏破旅行。2010年のLotYはRuby。結城浩氏のような仕事をしたいと妄想する30代後半♂。