応用第5日目:コレクション①

ArrayListを中心にコレクションを学びます。追加・取得・削除、ジェネリクス、拡張for文を確認します。

応用 1 2 3 4 5 6 7

応用第5日目:コレクション①

コレクション

コレクションとは

第5日目では配列を学びましたが、配列はサイズを宣言時に決める必要がありました。コレクションは、サイズが可変で要素の追加・削除が自由にできる、より柔軟なデータの入れ物です。Javaにはいくつかのコレクションクラスが用意されており、ここでは最もよく使われるArrayListを学びます。

ArrayListとは

ArrayListは、要素を動的に追加・削除できるリスト型のコレクションです。使用するにはjava.util.ArrayListをインポートする必要があります。主なメソッドは以下のとおりです。

  • add(要素):リストの末尾に要素を追加します。
  • remove(添字):指定した位置の要素を削除します。
  • get(添字):指定した位置の要素を取得します。
  • size():リストの要素数を返します。

サンプルプログラム

Student.java
package exday5;

public class Student {
    private String name;
    private int grade;
    private int number;

    public Student(String name,int grade,int number){
        this.name = name;
        this.grade = grade;
        this.number = number;
    }

    public String getName(){
        return name;
    }

    public int getGrade(){
        return grade;
    }

    public int getNumber(){
        return number;
    }
}
SampleEx501.java
package exday5;

import java.util.*;

public class SampleEx501 {
    public static void main(String[] args) {
        ArrayList al = new ArrayList();
        al.add(new Student("安藤一郎",1,1));
        al.add(new Student("伊藤花子",1,2));
        al.add(new Student("太田たかし",2,3));
        al.add(new Student("加藤紀子",2,4));
        al.add(new Student("木田直美",3,5));
        al.remove(3);
        for(int i = 0; i < al.size() ; i++){
            Student s = (Student)al.get(i);
            System.out.println("番号:" + s.getNumber() + " 名前: " + s.getName() + " 学年" + s.getGrade());
        }
    }
}
番号:1 名前: 安藤一郎 学年1
番号:2 名前: 伊藤花子 学年1
番号:3 名前: 太田たかし 学年2
番号:5 名前: 木田直美 学年3

5人の学生を追加した後、al.remove(3)で添字3(4番目)の「加藤紀子」を削除しています。そのため「加藤紀子」は表示されません。(図5-1、図5-2)

ArrayListへのデータ追加

図5-1:ArrayListへのデータ追加

ArrayListからのデータ削除

図5-2:ArrayListからのデータ削除

ジェネリクスと拡張for文

ジェネリクス

SampleEx501では、al.get(i)で取得した要素を(Student)とキャストしていました。ジェネリクスを使うと、ArrayListに格納する型を宣言時に指定でき、キャストが不要になります。

SampleEx502.java
package exday5;

import java.util.*;

public class SampleEx502 {
    public static void main(String[] args) {
        ArrayList<Student> al = new ArrayList<Student>();
        al.add(new Student("安藤一郎",1,1));
        al.add(new Student("伊藤花子",1,2));
        al.add(new Student("太田たかし",2,3));
        al.add(new Student("加藤紀子",2,4));
        al.add(new Student("木田直美",3,5));
        al.remove(3);
        for(Student s : al){
            System.out.println("番号:" + s.getNumber() + " 名前: " + s.getName() + " 学年" + s.getGrade());
        }
    }
}
番号:1 名前: 安藤一郎 学年1
番号:2 名前: 伊藤花子 学年1
番号:3 名前: 太田たかし 学年2
番号:5 名前: 木田直美 学年3

ArrayList<Student>と宣言することで、Student型の要素しか格納できなくなり、取り出し時のキャストが不要になります。また、for(Student s : al)という拡張for文を使うことで、コレクションの全要素をシンプルに繰り返し処理できます。

拡張for文

拡張for文はジェネリクスと組み合わせて使うことで、コレクションの要素を簡潔に処理できます。以下のサンプルで動作を確認しましょう。

SampleEx503.java
package exday5;

import java.util.*;

public class SampleEx503 {
    public static void main(String[] args) {
        ArrayList<String> sl = new ArrayList<String>();
        sl.add("ONE");
        sl.add("TWO");
        sl.add("THREE");
        for(String s: sl){
            System.out.print(s+" ");
        }
        System.out.println();
        ArrayList<Integer> il = new ArrayList<Integer>();
        il.add(1);
        il.add(2);
        il.add(3);
        for(Integer i: il){
            System.out.print(i + " ");
        }
        System.out.println();
    }
}
ONE TWO THREE
1 2 3

String型とInteger型のArrayListをそれぞれ作成し、拡張for文で全要素を表示しています。ジェネリクスにはint型などのプリミティブ型は使用できないため、Integer型(int型のラッパークラス)を使用しています。(図5-3)

拡張for文

図5-3:拡張for文

練習問題 応用5 へ →