第9章 クラスライブラリについて

9.6 ArrayListクラスについて

本章の学習でクラスライブラリについてやクラス型の変数の扱い方や配列としての利用方法について学習を行ってきました。クラスライブラリやクラス型について知識も深まってきた所で、クラスライブラリの中でもよく使われるArrayListクラスの使い方について学習していきます。(※9.2.4項の「その他のクラスについて」で少し紹介を行っています)

9.6.1 ArrayListと配列の違い

ArrayListを一言で表すと配列になります。但し、これまで学習してきた配列とは大きな違いがあり、それは要素数の決まっていない配列となる点です。通常の配列を利用する時には、以下で示すように要素数を決定しなければいけません。一旦定義した要素数は後から変更することができないことも思いだして下さい・
int[] score = new int[3]; //int型のデータを3つ扱う配列

ArrayListと配列の違い

通常の配列は要素数が固定されるので「固定長配列」、ArrayList配列は要素数(初期10個~2^31-1迄)が変化するので「可変長配列」と呼ばれます。
ArrayListがなぜ良く使われるのかと言うと、固定長か可変長の違いがとても重要になります。なぜならプログラムの世界では不特定量のデータを扱うことが非常に多い為です。
実際無理にArrayListを使わなくても、通常の配列だけでプログラムを組むことは可能です。しかしそうすると不特定量のデータを扱う場合、配列の要素を見込みで大量に設定しなければならなくなり、メモリを無駄に消費してしまう結果になってしまいます。
見込みで設定しておいてもデータ件数の想定が甘く、枠に収まらない状況になってしまうとエラーが起こり修正の必要が出てきます。そのような場合に可変長配列である「ArrayList」を利用していれば、データ量に合わせて配列のサイズが自動で変わる為、データ量を気にする必要や修正の必要も無くなります。
このような理由からJavaプログラムでは、固定長配列よりも可変長配列のArrayListが良く使われています。

9.6.2 ArrayListクラスの利用方法

ArrayListクラスを利用するためには以下のような手順が必要です。
① ArrayListクラスを利用したいクラスにインポートを行う。
② 扱いたいデータ型を選んでArrayListクラスのオブジェクト化を行う。
③ ArrayList配列にデータの追加、変更、削除、取り出し等を行う場合、専用のメソッドを利用して行う。
④ その他処理に応じて専用のメソッドを利用する。
以下に基本構文を示します。

書式:ArrayListクラス

※ArrayListクラスを利用するには「java.util.ArrayList」パッケージのインポートが前提です。

  ArrayList<扱う型> オブジェクト変数名 = new ArrayList<扱う型>(初期サイズ値);
  

初期サイズは任意の数を指定してサイズを確保できますが省略も可能です。省略した場合はデフォルトサイズとして10となり、サイズが足りなくなる度に自動で現サイズの50%ずつ拡張してくれます。 扱う型にはクラス名を指定します。ここで注意しなければいけないのは基本データ型が定義できない点です。しかし基本データ型にはラッパクラスが用意されていますので、int型のデータを扱いたい場合はIntegerを定義すれば問題ありません。ラッパクラスの一覧は9.2.4項の表9.2-2を参考にして下さい。

凡例:ArrayListクラス

  ArrayList<Integer> intList = new ArrayList<Integer>(); //整数型を扱う可変長配列
  ArrayList<String> strList = new ArrayList<String>(); //文字列型を扱う可変長配列
  ArrayList<Computer> comList = new ArrayList<Computer>(); //Computer型を扱う可変長配列
  
ArrayListのサイズ拡張について

ArrayList配列は枠が足りなくなると自動で超える前のサイズの50%ずつ拡張していく仕様となっています。例として初め10枠とすると11枠目を追加すると+5枠の16枠になり、次17枠目にデータを追加すると+8枠の25枠になっていきます。
拡張を繰り返すと追加枠を使い切らないケースも発生し、結局固定長の配列のようにメモリ領域を無駄にすることになります。そのような時には枠サイズの最適化を行う専用のメソッド「trimTosize()」が用意されています。データの追加が終った後に呼び出せば、使用していない枠を現在の要素数まで最適化することができメモリの無駄を無くすことができます。
近年のパソコンはメモリ容量が多くなっているので、メモリの使用量をあまり気にする必要はないかもしれませんが最適化できる所はやっておく方がシステム的には大変良いです。

ArrayListクラスの定義方法を学習した所で、次の節より具体的な利用方法を説明していきます。

9.6.3 ArrayList配列にデータを格納しその中身を確認するプログラム

ArrayList配列に提供されているデータ格納用メソッド「add()」を利用してデータを格納し、ArrayList配列に格納されたデータを確認します。

書式:ArrayList配列にデータ格納

addメソッドは現在のリストの最後にデータを追加します。addメソッドを利用してデータ格納を行うと、配列と同様にインデックスを持ち0番から管理されます。

  オブジェクト変数名.add(データ);
  

凡例:ArrayList配列にデータ格納

  intList.add(100); //整数型を扱う可変長配列にデータを追加
  strList.add("おはよう"); //文字列型を扱う可変長配列にデータを追加
  

凡例:ArrayList配列格納データの全表示

  System.out.println(intList); //整数型を扱う可変長配列の格納データ全表示
  System.out.println(strList); //文字列型を扱う可変長配列の格納データ全表示
  

① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch09
③ 名前: UseArrayList1
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

  package jp.co.f1.basic.ch09;

  import java.util.ArrayList;

  public class UseArrayList1 {
    public static void main(String[] args) {
      //文字列を扱うArrayList配列
      ArrayList<String> strList = new ArrayList<String>();

      //1つ目の文字列を追加
      strList.add("Good morning");
      System.out.println("1つ目追加時の全データは" + strList + "です。");

      //2つ目の文字列を追加
      strList.add("Hello");
      System.out.println("2つ目追加時の全データは" + strList + "です。");

      //3つ目の文字列を追加
      strList.add("Bye");
      System.out.println("3つ目追加時の全データは" + strList + "です。");

    }
  }
  
実行結果

解説

3行目でArrayListクラスを利用する為にパッケージをインポートしています。このインポート文が無いとArrayListクラスは利用できないので必ずインポートを行うようにして下さい。

  import java.util.ArrayList;
  

8行目で文字列を扱う可変長配列として、ArrayListクラスのオブジェクト生成を行っています。

  ArrayList<String> strList = new ArrayList<String>();
  

11行目でArrayListクラスの「addメソッド」を利用し、文字列「Good morning」を格納しています。

  strList.add("Good morning");
  

12行目でArrayList配列内に格納されている全データを表示しています。

  System.out.println("1つ目追加時の全データは" + strList + "です。");
  

15、16行目も同様にArrayList配列に文字列「Hello」を格納してから全データを表示しています。

  strList.add("Hello");
  System.out.println("2つ目追加時の全データは" + strList + "です。");
  

19、20行目も同様にArrayList配列に文字列「Bye」を格納してから全データを表示しています。

  strList.add("Bye");
  System.out.println("3つ目追加時の全データは" + strList + "です。");
  

実行結果からも分かるようにデータが追加される毎に、データが増えているのが正しく確認できます。

ポイント
  • ArrayList配列にデータを格納する場合は、addメソッドを利用して行う。
  • 格納データを全て表示したい場合は、標準出力にオブジェクト変数を指定する。

9.6.4 ArrayList配列に格納したデータを1つずつ取り出して確認するプログラム

ArrayList配列に提供されているデータ取出し用メソッド「get()」を利用して、ArrayList配列に格納されたデータを1つずつ取り出して確認します。ArrayList配列のデータの取り出し方について学習しましょう。

書式:ArrayList配列からデータ1つ取得

インデックスとは格納されている順番に対応します。番号は0開始になっていることに注意して下さい。

  オブジェクト変数名.get(インデックス);
  

凡例:ArrayList配列からデータ1つ取得

  Int num = intList.get(0); //整数型を扱う可変長配列から1番目のデータ取得
  String str = strList.get(9); //文字列型を扱う可変長配列から10番目データ取得
  

① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch09
③ 名前: UseArrayList2
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

  package jp.co.f1.basic.ch09;

  import java.util.ArrayList;

  public class UseArrayList2 {
    public static void main(String[] args) {
      //文字列を扱うArrayList配列
      ArrayList<String> strList = new ArrayList<String>();

      //1つ目の文字列を追加と表示
      strList.add("Good morning");
      System.out.println("1つ目の格納データは「" + strList.get(0) + "」です。");

      //2つ目の文字列を追加と表示
      strList.add("Hello");
      System.out.println("2つ目の格納データは「" + strList.get(1) + "」です。");

      //3つ目の文字列を追加と表示
      strList.add("Bye");
      System.out.println("3つ目の格納データは「" + strList.get(2) + "」です。");

    }
  }
  
実行結果

解説

8行目で文字列を扱う可変長配列として、ArrayListクラスのオブジェクト生成を行っています。

  ArrayList<String> strList = new ArrayList<String>();
  

11行目では前項で利用した「addメソッド」を利用して、文字列「Good morning」をArrayList配列に格納しています。続いて12行目では引数で指定したインデックスの要素データを取り出す「getメソッド」を利用して、11行目で格納した1つ目(インデックス:0)のデータを取り出し画面に出力を行っています。

  strList.add("Good morning");
  System.out.println("1つ目の格納データは「" + strList.get(0) + "」です。");
  

15行目、19行目もArrayList配列に文字列を格納しています。そして16行目では2つ目(インデックス:1)に追加したデータを表示する為に「getメソッド」の引数1を指定して呼び出しています。3つ目(インデックス:2)も同様に「getメソッド」の引数2を指定して呼び出しています。

  strList.add("Hello");
  System.out.println("2つ目の格納データは「" + strList.get(1) + "」です。");
  …
  strList.add("Bye");
  System.out.println("3つ目の格納データは「" + strList.get(2) + "」です。");
  

前項ではオブジェクト変数名を標準出力すると、格納されているデータが全て表示されていました。今回は実行結果からも分かるように、getメソッドを利用して要素の値を1つずつ取得し正しく表示できています。

ポイント
  • ArrayList配列の格納データを1つずつ取得する場合は、getメソッドを利用して行う。
  • 但し取り出したいデータのインデックスを指定する必要がある。

9.6.5 ArrayList配列に格納したデータサイズを確認するプログラム

ArrayList配列に提供されているデータサイズ取得用メソッド「size()」を利用して、格納されているデータサイズ(格納数)の確認を行います。ArrayList配列のデータサイズの確認方法について学習しましょう。

書式:ArrayList配列に格納されているデータサイズ(格納数)取得

格納されているデータサイズ(格納数)を整数値で取得できます。

  オブジェクト変数名.size();
  

凡例:ArrayList配列に格納されているデータサイズ(格納数)取得

  int count = strList.size();		//格納データサイズを取得
  

① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch09
③ 名前: UseArrayList3
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

7~20行目の処理は9.6.4項と全く同じ処理となっており、今回の処理追加部分は22、23行目のみです。

  package jp.co.f1.basic.ch09;

  import java.util.ArrayList;

  public class UseArrayList3 {
    public static void main(String[] args) {
      //文字列を扱うArrayList配列
      ArrayList<String> strList = new ArrayList<String>();

      //1つ目の文字列を追加と表示
      strList.add("Good morning");
      System.out.println("1つ目の格納データは「" + strList.get(0) + "」です。");

      //2つ目の文字列を追加と表示
      strList.add("Hello");
      System.out.println("2つ目の格納データは「" + strList.get(1) + "」です。");

      //3つ目の文字列を追加と表示
      strList.add("Bye");
      System.out.println("3つ目の格納データは「" + strList.get(2) + "」です。");

      //ArrayList配列の格納データ数を表示
      System.out.println("格納データ数は「" + strList.size() + "」件です。");

    }
  }
  
実行結果

解説

7~20行目の処理は前項と同じになっています。
23行目でArrayList配列に格納されているデータサイズを表示する為に「sizeメソッド」を呼び出して、画面に結果を出力しています。

  System.out.println("格納データ数は「" + strList.size() + "」件です。");
  

実行結果からも分かるように今回のプログラムではデータサイズはaddした数となり、正しくデータサイズ3が画面に表示できています。

ポイント
  • ArrayList配列の格納データサイズを取得する場合は、sizeメソッドを利用して行う。

これまでの紹介してきたArrayListの仕組みを、イメージで確認してみましょう。


図 9.6.1: ArrayList配列の追加・取得・データサイズの仕組み

9.6.6 繰り返し文を利用してArrayList配列の全データを表示するプログラム

ArrayList配列に提供されているデータサイズ取得用メソッド「size()」と繰り返し文(for)を利用して、格納されている全データを表示します。ArrayList配列とfor文を連携させたプログラムについて学習しましょう。

① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch09
③ 名前: UseArrayList4
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

  package jp.co.f1.basic.ch09;

  import java.util.ArrayList;

  public class UseArrayList4 {
    public static void main(String[] args) {
      //文字列を扱うArrayList配列
      ArrayList<String> strList = new ArrayList<String>();

      //文字列を追加
      strList.add("Good morning");
      strList.add("Hello");
      strList.add("Bye");

      //繰り返し処理を利用して全件表示
      for(int i=0; i<strList.size(); i++ ){
        System.out.println((i+1)+"つ目の格納データは「" + strList.get(i) + "」です。");
      }
    }
  }
  
実行結果

※9.6.4項と同じ実行結果になります。

解説

8行目で文字列を扱うArrayList配列のオブジェクト生成を行っています。

  ArrayList<String> strList = new ArrayList<String>();
  

11~13行目では3回addメソッドを利用して文字列を格納しています。

  strList.add("Good morning");
  strList.add("Hello");
  strList.add("Bye");
  

16行目で「for文」と配列データサイズ取得メソッドの「size()」を連携させて、データサイズ分だけ繰り返し処理を行わせています。そして17行目で繰り返し処理のカウント変数「i」を引数に配列データ取得メソッド「get()」を呼び出して画面にデータを出力しています。
カウント変数iの値は0から開始されているので、件数を表示する際に1をプラスしています。
getメソッドへの引数はそのままカウンタ変数iを設定すれば問題ありません。その理由は前項の図9.6.1を見て復習してみて下さい。

  for(int i=0; i<strList.size(); i++ ){
    System.out.println((i+1)+"つ目の格納データは「" + strList.get(i) + "」です。");
  }
  

実行結果からも分かるようにデータの格納サイズ分の3データが正しく画面に表示されています。

ポイント
  • 繰り返し文のカウンタ変数とArrayList配列の格納データサイズを連携して利用すれば、ArrayList配列に格納されている全てのデータを簡単に取得(参照)することができる。

勘の良い人なら今回の連携方法に似た処理を、通常の配列で行っていたことを思い出したのではないでしょうか?

  int[] score = new int[3]; 
  …
  for(int i=0; i<score.length; i++){
    System.out.println(score[i]);
  }
  

繰り返し文のカウント変数を利用して全データを参照することは、通常配列でもArrayList配列でも同じような処理で行えることを是非覚えておいて下さい。

拡張for文

この項で繰り返し文のカウンタ変数とArrayList配列の格納データサイズを連携して利用すれば全データを表示できることは学習しました。通常の配列やArrayList配列のデータを順に参照していくだけの方法ならば少し違った記述が行えます。それはfor文の少し違った使い方の拡張for文(for-each文)があります。

参考例
    ArrayList<String> strList = new ArrayList<String>();
    ・・・
    //拡張for文を利用して格納データを順に参照
    for(String strData : strList){
      System.out.println("格納データは「" + strData + "」です。");
    }
    

上記のような書き方もできますので、気になる人は使い方を調べてみて下さい。

9.6.7 ArrayList配列に格納したデータを変更するプログラム

ArrayList配列に提供されているデータ変更用メソッド「set()」を利用して、既に格納されているデータの変更を行います。ArrayList配列に格納されたデータの変更方法について学習しましょう。

書式:ArrayList配列に格納されているデータを変更

第1引数のインデックスを、第2引数の値で変更します。

  オブジェクト変数名.set(インデックス , データ);
  

凡例:ArrayList配列に格納されているデータを変更

  intList.set(0,999); //1番目に格納されている値を999に変更
  strList.set(2,"Thank you"); //3番目に格納されている値をThank youに変更
  

① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch09
③ 名前: UseArrayList5
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

  package jp.co.f1.basic.ch09;

  import java.util.ArrayList;

  public class UseArrayList5 {
    public static void main(String[] args) {
      //文字列を扱うArrayList配列
      ArrayList<String> strList = new ArrayList<String>();

      //文字列を追加
      strList.add("Good morning");
      strList.add("Hello");
      strList.add("Bye");

      //繰り返し処理を利用して全件表示
      System.out.println("■変更前のデータ一覧");
      for(int i=0; i<strList.size(); i++ ){
        System.out.println((i+1)+"つ目の格納データは「" + strList.get(i) + "」です。");
      }

      //3つ目のデータを変更
      strList.set(2, "Good Bye!");

      System.out.println("\n■変更後のデータ一覧");
      for(int i=0; i<strList.size(); i++ ){
        System.out.println((i+1)+"つ目の格納データは「" + strList.get(i) + "」です。");
      }
    }
  }
  
実行結果

解説

8~19行目の処理は前項のプログラムと内容は同じで、変更前の全データを画面に表示しています。
22行目のデータ変更用メソッド「set()」を利用して、引数で渡したインデックス2(3つ目)に格納しているデータ「Bye」を文字列「Good Bye!」で変更しています。

  strList.set(2, "Good Bye!");
  


図 9.6.2: ArrayList配列の変更の仕組み

25~27行目は再度ArrayList配列に格納されている全データを画面に表示しています。

  System.out.println("\n■変更後のデータ一覧");
  for(int i=0; i<strList.size(); i++ ){
    System.out.println((i+1)+"つ目の格納データは「" + strList.get(i) + "」です。");
  }
  

実行結果から分かるように変更前3つ目に格納してあったデータ「Bye」が、変更後では「Good Bye!」に変更され正しく画面に表示されています。

ポイント
  • ArrayList配列に格納済みデータを変更する場合は、setメソッドを利用して行う。

9.6.8 ArrayList配列に格納したデータを1つ削除するプログラム

ArrayList配列に提供されている任意データ削除用メソッド「remove()」を利用して、既に格納されているデータの削除を行います。ArrayList配列に格納されたデータの削除方法について学習しましょう。

書式:ArrayList配列に格納されている任意データを削除

第1引数で指定したインデックスの格納データを削除します。間のデータが削除されると詰めて格納し直します。

  オブジェクト変数名.remove(インデックス);
  

凡例:ArrayList配列に格納されている任意データを削除

  strList.remove(2); //3番目に格納されているデータを削除
  

① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch09
③ 名前: UseArrayList6
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

  package jp.co.f1.basic.ch09;

  import java.util.ArrayList;

  public class UseArrayList6 {
    public static void main(String[] args) {
      //文字列を扱うArrayList配列
      ArrayList<String> strList = new ArrayList<String>();

      //文字列を追加
      strList.add("Good morning");
      strList.add("Hello");
      strList.add("Bye");

      //繰り返し処理を利用して全件表示
      System.out.println("■変更前のデータ一覧");
      for(int i=0; i<strList.size(); i++ ){
        System.out.println((i+1)+"つ目の追加データは「" + strList.get(i) + "」です。");
      }
      //3つ目のデータを変更
      strList.set(2, "Good Bye!");
      //2つ目のデータを削除
      strList.remove(1);

      System.out.println("\n■変更後のデータ一覧");
      for(int i=0; i<strList.size(); i++ ){
        System.out.println((i+1)+"つ目の追加データは「" + strList.get(i) + "」です。");
      }
    }
  }
  
実行結果

解説

8~21行目の処理は前項のプログラムと内容は同じで、変更前の全データを表示して3つ目のデータ変更を行っています。
23行目の任意データ削除用メソッド「remove()」を利用して、引数で渡したインデックス1(2つ目)の格納データ「Hello」を削除しています。

  strList.remove(1);
  


図 9.6.3: ArrayList配列の変更の仕組み

25~27行目は再度ArrayList配列に格納されている全データを画面に表示しています。

  System.out.println("\n■変更後のデータ一覧");
  for(int i=0; i<strList.size(); i++ ){
    System.out.println((i+1)+"つ目の格納データは「" + strList.get(i) + "」です。");
  }
  

実行結果から分かるように削除前2つ目に格納してあったデータ「Hello」が、削除後では表示されていないので正しく削除処理が行われています。

ポイント
  • ArrayList配列に格納済みの任意データを削除する場合は、removeメソッドを利用して行う。

9.6.9 ArrayList配列に格納したデータから検索を行うプログラム

ArrayList配列に提供されている任意データ検索用メソッド「indexOf()」を利用して、既に格納されているデータの中から検索を行います。ArrayList配列に格納されたデータを検索するメソッドについて学習しましょう。

書式:ArrayList配列に格納されている任意データの検索

第1引数で指定したデータをArrayList配列から検索します。見つかった場合はデータが格納されているインデックス番号、見つからなかった場合は「-1」を戻り値として返します。

  オブジェクト変数名.indexOf(検索データ);
  

凡例:ArrayList配列に格納されている任意データの検索

  int index = strList.indexOf("おはよう"); //格納データからおはようを検索
  

① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch09
③ 名前: UseArrayList7
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

  package jp.co.f1.basic.ch09;

  import java.util.ArrayList;

  public class UseArrayList7 {
    public static void main(String[] args) {
      //検索結果のインデックス格納用変数
      int index;

      //文字列を扱うArrayList配列
      ArrayList<String> strList = new ArrayList<String>();

      //文字列を追加
      strList.add("Good morning");
      strList.add("Hello");
      strList.add("Bye");

      //繰り返し処理を利用して全件表示
      System.out.println("■変更前のデータ一覧");
      for(int i=0; i<strList.size(); i++){
        System.out.println((i+1)+"つ目の格納データは「" + strList.get(i) + "」です。");
      }

      //ArrayList配列格納データから検索
      System.out.println("----------------------------------------");
      index = strList.indexOf("Hello");

      //検索結果をチェック
      if(index != -1){
        System.out.println("Helloは要素番号「" + index + "」に格納されています。");
      }else{
        System.out.println("Helloは見つかりませんでした。");
      }
      //3つ目のデータを変更
      strList.set(2, "Good Bye!");
      //2つ目のデータを削除
      strList.remove(1);

      System.out.println("\n■変更後のデータ一覧");
      for(int i=0; i<strList.size(); i++ ){
        System.out.println((i+1)+"つ目の格納データは「" + strList.get(i) + "」です。");
      }

      //ArrayList配列格納データから検索
      System.out.println("----------------------------------------");
      index = strList.indexOf("Hello");

      //検索結果をチェック
      if(index != -1){
        System.out.println("Helloは要素番号「" + index + "」に格納されています。");
      }else{
        System.out.println("Helloは見つかりませんでした。");
      }
    }
  }
  
実行結果

解説

まず8行目で検索結果のインデックスを格納する変数宣言を行っています。

  int index;
  

10~22行目の処理は前項のプログラムと内容は同じで、変更前の全データを表示しています。
26行目の処理で検索用メソッド「indexOf()」を利用して、引数で渡した「Hello」をArrayList配列から検索しています。戻り値として変数indexに検索結果の値(見つからなかった場合は-1、見つかった場合は格納場所のインデックス)を受け取ります。

  index = strList.indexOf("Hello");
  

29~33行目の条件文で26行目の処理の検索結果の判定を行っています。Indexが-1でなければデータが検索できたことになるので条件式はindex != -1で否定しています。

  if(index != -1){
    System.out.println("Helloは要素番号「" + index + "」に格納されています。");
  }else{
    System.out.println("Helloは見つかりませんでした。");
  }
  

実行結果から分かるように「Hello」は2つ目(インデックス1)に格納されているので検索で見つけることができ、画面に見つかったインデックス番号が正しく表示されています。

34~42行目の処理は前項のプログラムと内容は同じで、3つ目に格納したデータ変更、2つ目の格納データ削除を行い変更後のデータを全て表示しています。
37行目の処理でArrayListの要素1番目の「Hello」の削除を行います。

  index = strList.indexOf("Hello");
  

49~53行目も29~33行目と同じ検索結果の判定処理を行っています。

  if(index != -1){
    System.out.println("Helloは要素番号「" + index + "」に格納されています。");
  }else{
    System.out.println("Helloは見つかりませんでした。");
  }
  

実行結果から分かるように「Hello」は削除され無いので、見つからなかった判定が正しく行われています。

ポイント
  • ArrayList配列の格納データから検索する場合は、indexOfメソッドを利用して行う。
  • 見つかった場合は格納場所のインデックス、見つからなかった場合は-1が戻り値になる。

9.6.10 ArrayList配列の全削除を行い配列が空か判定を行うプログラム

ArrayList配列に提供されている全削除用メソッド「clear()」と空判定用メソッド「isEmpty()」を利用して、配列の初期化と空かどうかの判定を行います。ArrayList配列に格納された全てのデータを削除する方法とデータの有無を確認する方法について学習しましょう。

書式:ArrayList配列に格納されている全データの削除

  オブジェクト変数名.clear();
  

凡例:ArrayList配列に格納されている全データの削除

  strList.clear(); //格納データ全てを削除
  

書式:ArrayList配列の格納データ数が空なのかを判定

ArrayList配列が空かどうかを判定し、戻り値として空だった場合「true」、データが1つでもある場合は「false」を返します。

  オブジェクト変数名.isEmpty();
  

凡例:ArrayList配列の格納データ数が空かどうかを判定

  boolean result = strList.isEmpty(); //格納データが空なのか判定
  

① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch09
③ 名前: UseArrayList8
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

  package jp.co.f1.basic.ch09;

  import java.util.ArrayList;

  public class UseArrayList8 {
    public static void main(String[] args) {
      //文字列を扱うArrayList配列
      ArrayList<String> strList = new ArrayList<String>();

      //文字列を追加
      strList.add("Good morning");
      strList.add("Hello");
      strList.add("Bye");

      //繰り返し処理を利用して全件表示
      System.out.println("■クリア前のデータ一覧");
      for(int i=0; i<strList.size(); i++ ){
        System.out.println((i+1)+"つ目の格納データは「" + strList.get(i) + "」です。");
      }

      //ArrayList配列の格納データを全削除
      strList.clear();

      System.out.println("\n■クリア後のデータ一覧");
      //ArrayList配列の格納データ数チェック
      if(strList.isEmpty()){
        System.out.println("データは1件もありません");
      }else{
        for(int i=0; i<strList.size(); i++ ){
          System.out.println((i+1)+"つ目の格納データは「" + strList.get(i) + "」です。");
        }
      }
    }
  }
  
実行結果

解説

8~19行目の処理はこれまでのプログラムの内容と同じで、クリア前の全データを表示しています。
22行目の処理で全データ削除用メソッド「clear()」を利用して、ArrayList配列の格納データ全ての削除を行っています。

  strList.clear();
  

26行目の処理で格納データ空チェックメソッド「isEmpty()」を利用して、データが格納されているかのチェックを行っています。チェックの結果が「true」の場合ifブロック内の処理を行い、「false」の場合ならelseブロックの処理を行うようにしています。今回はチェック処理の前にデータを全削除を行っているのでifブロック内の処理が行われることになります。

  if(strList.isEmpty()){
    System.out.println("データは1件もありません");
  }else{
    for(int i=0; i<strList.size(); i++ ){
      System.out.println((i+1)+"つ目の格納データは「" + strList.get(i) + "」です。");
    }
  }
  

実行結果からも分かるように、クリア後のデータ一覧が出力されていないので正しく判定処理が行われています。

ポイント
  • ArrayList配列の格納データを全て削除する場合は、clearメソッドを利用して行う。
  • ArrayList配列の格納データの格納データが空かどうか調べる場合は、isEmptyメソッドを利用して行う。

9.6.11 ArrayList配列をメソッドの引数に利用するプログラム

ArrayList配列を引数とする自作メソッドを利用して配列データの全表示処理を行います。ArrayList配列をメソッドの引数に利用するプログラムについて学習しましょう。

① ソース・フォルダー: myproj_basic/src
② パッケージ: jp.co.f1.basic.ch09
③ 名前: UseArrayList9
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

  package jp.co.f1.basic.ch09;

  import java.util.ArrayList;

  public class UseArrayList9 {
    /*
    * 引数に文字列を扱うArrayList配列を受け取り、その配列の全データを表示する
    */
    public static void showArrayListData(ArrayList<String> tmpStrList){
      for(int i=0; i<tmpStrList.size(); i++ ){
        System.out.println((i+1)+"つ目の格納データは「" + tmpStrList.get(i) + "」です。");
      }
    }

    public static void main(String[] args) {
      //文字列を扱うArrayList配列
      ArrayList<String> strList = new ArrayList<String>();

      //文字列を追加
      strList.add("Good morning");
      strList.add("Hello");
      strList.add("Bye");

      //自作メソッドを利用して全件表示
      System.out.println("■クリア前のデータ一覧");
      showArrayListData(strList);

      //ArrayList配列を初期化
      strList.clear();

      System.out.println("\n■クリア後のデータ一覧");
      //ArrayList配列のデータ格納チェック
      if(strList.isEmpty()){
        System.out.println("データは1件もありません");
      }else{
        showArrayListData(strList);
      }
    }
  }
  
実行結果

※前項の実行結果と同じになります。

解説

今回は前項のプログラムのArrayList配列データ全て表示する処理部分を、メソッド化した内容になっている為解説は差異部分のみ行います。
先ずは9~13行目で引数にArrayList型、戻り値無しのメソッド「showArrayListData」を定義しています。クラスをメソッドで利用できることを9.4節で学習しました。当然ArrayListもクラスなのでメソッドの引数や戻り値に設定して利用できますが、今回は引数にのみ利用しています。
10~12行目が実際の処理部分になりますが、ここで記述されている処理はこれまでのプログラムで何度も見てきたArrayList配列の全データを全て画面に表示する処理になっています。

  public static void showArrayListData(ArrayList<String> tmpStrList){
    for(int i=0; i<tmpStrList.size(); i++ ){
      System.out.println((i+1)+"つ目の格納データは「" + tmpStrList.get(i) + "」です。");
    }
  }
  

26行目で「showArrayListDataメソッド」呼び出しを行っています。

  showArrayListData(strList);
  

実行結果から分かるように、引数にArrayList配列を渡してメソッドを呼び出しても正しく全データの表示が行われています。

36行目でも「showArrayListDataメソッド」呼び出しを行っていますが、今回の処理ではデータが全て削除されているのでこの処理を通ることはありません。

  showArrayListData(strList);
  

実行結果からも分かるように、データが無い場合の処理が行われている為メソッドの呼び出しは行われていないことが確認できます。

ポイント
  • ArrayList配列もクラスなのでメソッドの引数や戻り値として利用することができる。

本節ではArrayListクラスを利用する場合に、使用頻度が高いメソッドを中心に紹介してきました。紹介してきたメソッド以外にも、ArrayListクラスには色々な機能を持ったメソッドがまだ用意されています。
興味がある人はご自身で調べて、色々な使い方ができるように挑戦してみて下さい。

NEXT>> 9.7 本章のまとめ