【備忘録】Java_コレクション

f:id:nowa0402:20210505160433p:plain
こんにちは、のわです。
今回は勉強中のJavaからコレクションについて備忘録を残します。

前回の記事で勇者VSドラゴンの記事をあげました。
nowa-0402.hatenablog.com

そこから下記内容を追加して現在プログラム修正中です。
 ・職業魔法使いを増やす。
 ・モンスターを増やす

魔法使いを増やしたことで勇者はパーティを組む必要が出てきました。
そこで、勉強したコレクションを使ってパーティ化することにしました。

※前提
 勇者=Heroクラス
 魔法使い=Wizardクラス
 勇者と魔法使いの親クラス=Characterクラス

【Main.java

    // ArrayListの記述省略のためimportしておく
    import java.util.*:

    // 勇者と魔法使いを生み出す
    Character c1 = new Hero();
    Character c2 = new Wizard();
    // 勇者と魔法使いでパーティを組む
    ArrayList<Character> party = new ArrayList<>();
    party.add(c1);
    party.add(c2);

コレクションと配列の違う点は要素を随時追加できる点です。

   // Character型のコレクション『party』を作成
    ArrayList<Character> party = new ArrayList<>();
 // partyに対して勇者と魔法使いのインスタンスを格納
    party.add(c1);
    party.add(c2);

上記で言うところの『.add()』メソッドが追加の役割を果たしています。
配列は事前にいくつ入れるのか決める必要があり
そこから要素を追加することは出来ませんでした。

コレクション(ArrayListの場合)だと
 ・要素追加は『.add(インスタンスの型)』
 ・要素削除は『.remove(int)』
と楽に追加、削除や取り出しが可能です。


では、コレクション化すると何が出来るようになるか。
実際にコレクションを活かしたプログラムを作ってみました。

【Main.java

    import java.util.*;

    // 勇者と魔法使いを生み出す
    Character c1 = new Hero();
    Character c2 = new Wizard();
    // 勇者と魔法使いでパーティを組む
    ArrayList<Character> party = new ArrayList<>();
    party.add(c1);
    party.add(c2);

   // ドラゴンを生み出す
   Dragon d = new Dragon();

  // ドラゴンがパーティに火を吹く
   d.fireBless(party);


【Dragon.java

 // ドラゴンがパーティに火を吹く
  import java.util.*;

  public void fireBless(ArrayList<Character> party) {
    System.out.println("ドラゴンは全体に火を吹いた!");
    for(int i = 0; i < party.size(); i++) {
      party.get(i).hp -= 20;
      System.out.println(party.get(i).name + "は20ポイントダメージを受けた!");
    }
  }

コレクションはデータ型、配列と同様、引数に指定することが可能です。
実際、どんな処理をしているのか簡単に説明します。

  public void fireBless(ArrayList<Character> party) {}

メソッドの引数にコレクションを指定しています。
変数名は任意の名前をつけます。
今回はMain.javaで付けたpartyにしています。

for(int i = 0; i < party.size(); i++) {
   party.get(i).hp -= 20;
   System.out.println(party.get(i).name + "は20ポイントダメージを受けた!");
    }

今回のポイントになります。
引数でもらった勇者御一行にどうやってダメージを与えるか
下記で詳細を説明します。

 for(int i = 0; i < party.size(); i++) {}

for文で何回繰り返すか設定しています。
『.size()』メソッドは格納されている要素数を返します。
今回、要素数は勇者と魔法使いの2人です。
つまり、『i < 2』となり、iが2になったら処理が終了します。

    party.get(i).hp -= 20;
    System.out.println(party.get(i).name + "は20ポイントダメージを受けた!");

この文でダメージを与えています。
『.get(int)』メソッドはint番目の要素を取り出します。
つまり、『party.get(i).hp -= 20;』は
『partyのi番目にいるキャラのHPを20引け』
という意味になります。
iはfor文で定義しています。
 ・繰り返し1回目なら『i = 0』となり、勇者が対象
 ・繰り返し2回目なら『i = 1』となり、魔法使いが対象
になります。

因みに、コレクションは配列と同じく要素は『0』から始まります。
『1』からでは無いので注意してください。



今回はコレクションを使ったプログラムを紹介しました。

私自身、コレクションを勉強した当初は
「何に使えるのこれ」という感じでした。
ですが、コードを書きながら、色々試行錯誤をしていくうちに
「色々できるやん!コレクションすごい!」と気づきました。

やっぱり、考えながらコードを書くのが一番楽しくて、勉強になりますね。


なお、コレクションは引数だけではなく、戻り値にも指定できます。
是非活用してみてください!

今回も最後まで見ていただきありがとうございました!