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

第32回 集合の数学 集合と要素[後編]

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

今回は,集合と要素に関するJava言語の演習問題をふたつ用意しました。概念を確認し,Java言語の基本的な文法やクラスライブラリの使い方を練習しましょう。気軽に取り組んでみてください。

問題:集合とJava言語に関する以下の問いに答えてください。

(1)10より小さな自然数のうち,偶数を整数型の配列とArrayListのオブジェクトにセットするプログラムを作ってください。結果が得られたら,偶数の個数を表示し,その後全ての偶数を表示しましょう。

明らかに偶数は2,4,6,8の4つ注1ですが,10より小さい偶数がいくつあるか「わからない」ものとして解いてみてください。

ArrayListを用いると,配列を用いた場合よりも何が便利になるのか考えながら問題に取り組みましょう。

(2)10より小さな自然数の集合を全体集合とし,(1)で作成した偶数の集合の補集合をとるプログラムを,配列の場合とArrayListの場合それぞれで作ってください。

(1)と同様,補集合の要素数を表示した後で各要素を表示させましょう。なお,偶数の集合はあらかじめ与えられているものとし,コード中に埋め込みましょう。

※1)
偶数は0や-2も含みますが,今回は自然数であるという条件がありますので,0や負数を含みません。

解説

(1)10より小さな自然数のうち,偶数を整数型の配列とArrayListのオブジェクトにセットするプログラムを作ってください。結果が得られたら,偶数の個数を表示し,その後全ての偶数を表示しましょう。

 先ずは配列で目的の処理を行ってみます。

ソースコード:GusuNoHairetsu.java

01: //filename : GusuNoHairetsu.java
02: //10 より小さい自然数のうち,偶数を配列a にセットする。
03: 
04: class GusuNoHairetsu {
05:   public static void main(String[] args) {
06:     //添え字が偶数なら1,奇数なら0 をセット。
07:     int temp[] = new int[10]; //探索リスト
08:     int even = 0; //偶数の数をカウント
09:     for ( int i = 1 ; i < 10; ++i) {
10:         if (i%2 == 0) {
11:             temp[i] = 1;
12:             ++even;
13:         } else temp[i] = 0;
14:     }
15:     System.out.println("偶数は"+even+"個");
16:     int a[] = new int[even];//偶数の個数分配列を用意
17:     int j = 0;
18:     for (int i = 0; i < 10 ; ++i){
19:         if (temp[i]==1) {
20:             a[j] = i;
21:             ++j;
22:         }
23:     }
24:      for( int i = 0;i<10 ; ++i){
25:         System.out.println("a["+i+"] = "+ a[i]);
26:   }// end of main
27: }// end of class GusuNoHairetsu

解説は後回しにして,ArrayListを用いて同じことをさせてみます。

ソースコード:GusuNoArrayList.java

01: //filename : GusuNoArrayList.java
02: //10 より小さい自然数のうち,偶数をArrayList A にセットする。
03: 
04: import java.util.ArrayList;
05: 
06: class GusuNoArrayList {
07:   public static void main(String[] args) {
08:     ArrayList A = new ArrayList();
09:     for ( int i = 1 ; i < 10 ; ++i )
10:         if ( i%2 == 0 ) A.add(i);
11:     System.out.println("偶数は" + A.size() + "個");
12:     for ( int i = 0 ; i < A.size() ; ++i )
13:         System.out.println("A("+i+") = " + A.get(i));
14:   }// end of main()
15: }// end of class GusuNoArrayList

実質半分以下に行数が減りました。キーボードを打つ数が減ります。

どちらが良いかというより,「どちらが目的に合うか」で配列とArrayListをはじめとするクラス群の使い分けが必要です。今,もし短くてわかりやすいプログラムを作ることが最優先であるとしましょう。その視点でコードをながめると,配列を使用した場合のコードGusuNoHairetsu.javaには次のような短所があります。

  • 一時的なデータの保存場所として,7行目の配列tempが使われる。
  • 偶数の数をカウントするために変数evenが使われる。
  • 繰り返しが3回行われる。

ArrayListクラスを用いることで,繰り返しの数は2回に減りました。計算に1回,表示に1回と目的に応じた最低限の回数です(※2)。

配列を用いた場合「10以下の偶数の個数がわからない」という前提ですから,偶数を格納する配列のサイズがあらかじめ決定できません。探索が完了した段階で,発見した偶数の個数に合った配列を宣言し,格納しています。配列の長さをその場その場で変更できない(「静的である」といいます)ので生じた不便です。

一方,ArrayListはあらかじめサイズを指定しなくても,データを追加するたびに増えてくれますし,削除すれば減ってくれます(「動的である」といいます)。

メモリの使用量,アクセス速度において配列の方がArrayListよりも利がありますが,ArrayListをはじめとするクラス群を使うことでプログラムがシンプルになり,トータルでのメモリの節約や実行速度の向上が望めます。何よりも,コードが読み下しやすくなる利点は得難いものです。

※2)
偶数を発見するたびにその数を表示し,偶数の個数を最後に表示することにすれば繰り返しは1回で済みますが,題意は先ず個数を表示することですから,2回必要です。

著者プロフィール

平田敦(ひらたあつし)

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

コメント

コメントの記入