応用第5日目:コレクション①
コレクション
コレクションとは
第5日目では配列を学びましたが、配列はサイズを宣言時に決める必要がありました。コレクションは、サイズが可変で要素の追加・削除が自由にできる、より柔軟なデータの入れ物です。Javaにはいくつかのコレクションクラスが用意されており、ここでは最もよく使われるArrayListを学びます。
ArrayListとは
ArrayListは、要素を動的に追加・削除できるリスト型のコレクションです。使用するにはjava.util.ArrayListをインポートする必要があります。主なメソッドは以下のとおりです。
- add(要素):リストの末尾に要素を追加します。
- remove(添字):指定した位置の要素を削除します。
- get(添字):指定した位置の要素を取得します。
- size():リストの要素数を返します。
サンプルプログラム
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;
}
}
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());
}
}
}
番号:2 名前: 伊藤花子 学年1
番号:3 名前: 太田たかし 学年2
番号:5 名前: 木田直美 学年3
5人の学生を追加した後、al.remove(3)で添字3(4番目)の「加藤紀子」を削除しています。そのため「加藤紀子」は表示されません。(図5-1、図5-2)
図5-1:ArrayListへのデータ追加
図5-2:ArrayListからのデータ削除
ジェネリクスと拡張for文
ジェネリクス
SampleEx501では、al.get(i)で取得した要素を(Student)とキャストしていました。ジェネリクスを使うと、ArrayListに格納する型を宣言時に指定でき、キャストが不要になります。
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());
}
}
}
番号:2 名前: 伊藤花子 学年1
番号:3 名前: 太田たかし 学年2
番号:5 名前: 木田直美 学年3
ArrayList<Student>と宣言することで、Student型の要素しか格納できなくなり、取り出し時のキャストが不要になります。また、for(Student s : al)という拡張for文を使うことで、コレクションの全要素をシンプルに繰り返し処理できます。
拡張for文
拡張for文はジェネリクスと組み合わせて使うことで、コレクションの要素を簡潔に処理できます。以下のサンプルで動作を確認しましょう。
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();
}
}
1 2 3
String型とInteger型のArrayListをそれぞれ作成し、拡張for文で全要素を表示しています。ジェネリクスにはint型などのプリミティブ型は使用できないため、Integer型(int型のラッパークラス)を使用しています。(図5-3)
図5-3:拡張for文