カテゴリー
Java

班を分けるプログラムを作ろう

このプログラムはユーザーに任意の人数を入力させて、それを元にグループ分けを行うプログラムです。
このプログラムは長くて難しいので、初心者の方は飛ばしていただいて結構です。
では例をみてみましょう。111111111111
流れは以下の通りです。
人数を入力=>人数分の名前を入力=>班数を入力=>班に人を割り当てる。
結果は以下の通りです。1
では詳しく説明していきます。
〇 mainメソッドの外にメンバーを格納するための配列を作成しています。1 mainメソッドの外で宣言する変数や配列はクラス内のどこからでも使用することができます。
staticについては「staticについて知ろう」の章で説明します。

〇以下の箇所では人数を入力させていますが、もし、正しくない数値を入力するとwhileで何回も×が表示されることになります。1 whileの中の条件式にtrueを入れていますが、条件式の中にtrueを入れると無限ループになります。
無限ループとは今までの繰り返し文のように条件式がfalseにならないので、どこまでもループを繰り返します。
無限ループなので、どこかでbreakで抜けなくてはいけません。
MemberNumbersメソッドは正しく人数が入力されているかをチェックするメソッドですが、条件式がtrueであればbreakで抜けることが出来ます。
このようにifの条件式にメソッドを入れることが出来ることを覚えておいてください。
以下のように数字とは関係ないaなどを入力をすると×が出力されます。1 ではMemberNumbersメソッドについて説明します(スペースの都合で仮引数を2行目に書いています)。1 ユーザーに入力させた人数がlineに入っていますので、このlineの値が仮引数の1に渡されます。ユーザーに入力させたものは文字列なのでこれを整数に変換します。
これを行っているのが1です。
1については「if文で星座を判定しよう」で説明しましたので、忘れた方は見直してください。
そして、もちろん0人より多い数が入っていなくてはいけませんので、0より大きい数値が入っているのかを確認するために1を記述しています。
もし、0より大きい数値が入っているのならばTRUEを返し、breakで抜けます。1 そうでないのならばFALSEを返しますので、whileの中のif文はスルーされ1を実行します。さらにwhileの先頭に戻って「人数入力」と出力されます。
正しく入力されないと何度でも「人数入力」と出力されますが、これがwhileで無限ループを使用している理由です。

〇次の箇所では人の名前の入力を行います。1 では説明を始めます。1 この箇所では人数分の配列を作成します。
numbers にはlineの値を整数値に変換した数値が入っています。
そして、for文で1の要素の数だけ回し、名前を入力させます。
そして1の箇所ではisEmptyメソッドを使って、文字列がカラかどうかを確認します。
そしてカラではないならばlineをmembers配列に入れます。
もし空(未入力)であるならば1という形式でmembers配列に入れます。
そして1でカウントアップします。
つまり、無名の人数をカウントしています。
ではさらに詳しくisEmptyメソッドについて説明します。1 isEmptyメソッドは文字列がカラかどうかをチェックするメソッドです。
カラであればTRUE、カラでなければFALSEになります。
この例では否定の「!」が付いていますので、カラではない時にTRUEになります。
ここまでは例えば以下のようになります。1
〇以下の箇所ではグループの人数を入力します。1 GroupNumbersメソッドでグループの人数が正しく入力させているかどうかをチェックします。
正しく人数が入力してあればbreakで抜けます。
ではGroupNumbersメソッドの説明をします(紙面の都合でメソッドの引数を2段目に書いています)。1 引数のlineには班数が入り、 memberNumbersにはメンバーの人数が入ります。
次に以下の箇所を説明します。1 ここでは班数は0より大きく、なお、班数はメンバーの人数と同じか、小さくないといけませんのでこのような条件式にしています。
この条件式に合致していればTRUEになります。

〇以下の箇所ではメンバーをシャッフルしています。
なぜなら、毎回同じ班分けになってしまうと意味が無いからです。
shuffleMembers();
以下のメソッドでメンバーをシャッフルします。1 ここでは30回シャッフルするためにshuffleTimesには30を入力しています。
shuffleTimesの前にfinalが付いていますが、以下のような役割があります。1 次に以下の箇所の説明をします。1 ここではメンバーの人数までの数値をランダムメソッドで変数に入れています。
例えば1が5であれば0から4までがランダムにrndm1とrndm2に入ります。
次に以下の箇所の説明をします。1 ここではランダムに入力されたrndm1や rndm2を元にswapMemberメソッドを呼び出します。1 このswapMemberメソッドは何をしているかと言いますと、例えばaという変数とbという変数を交換しているわけです。
以下の例で説明しますとaとbを交換するのに以下のプログラムでは交換にはなりません。1 つまり、aもbもbの値で上書きされるので6になってしまいます。
aとbを交換するには以下のプログラムを使います。1 aとbを交換するには一時的にどちらかの変数を他の変数に入れておかないといけません。それがtmpです。
この例ではaをtmpに入れています。これによりaの値が上書きされないで済みます。
では例に戻りますが、このswapMemberメソッドのidx1とidx2にはランダムに入力された数が入っていますので、members配列の中の順番を逆にできるわけです。
この作業をshuffleTimesの数である30回行うわけですから、配列の中の順番はかなりランダムに変えることが出来ます。

〇次に以下の箇所の説明をします。1 ここで行いたいことは次の赤枠の箇所です。
結果を出力するのはこの箇所ではありませんが、ここではグループ分けを行っています。1 では具体的に説明をしていきます。1 ここでは班数の分だけgroups配列の要素を作成して、その要素を1で初期化しています。
次は以下の箇所の説明をします。1 この箇所はすべてのメンバーをグループに振り分けています。
「i % groups.length」の箇所はメンバーが4人で班が3だとするとループするごとに以下のように回ります。1 groups[targetIndex]のなかのtargetIndexには0,1,2,0が順番に入るわけです。
つまり、ループするごとに1に該当するメンバーが左辺の1に入ります。
メンバーが4人でグループが3の場合には1周目で例えば1という形式で1に入ります。
2周目では11に入り、
3周目では11に入り、
4周目では1という形式で1に入ります。

〇最後にfor文でgroups変数を出力すると例えば以下のようになります。11 名前を入力しなけれは無名1、無名2と、無名の数だけ表示されます。1