はじめに
今回は、プログラミング言語のJavaをStudyしていきます。また、javaの中でもけっこーややこしい『ArrayListクラスにクラスを格納する』という1点にフォーカスを当て解説を進めていきます。
対象者としては、『配列の中にクラスを格納して利用するのが苦手な人』、『ArrayListという訳分からんクラスの利用法が曖昧な人』などを対象にこの記事は書かれています。
いっそのことArrayListを使わないという選択肢もあります。しかし、それはとても非現実的であり、非効率です。もし、あなたが一流のプログラマーを目指しているのであれば、この壁は避けるべきではありません。是非、このページで手を動かしながら簡単にマスターしていきましょう!
ArrayListクラスとは
ArrayListは、普通の配列とは違って、必要に応じて自動的に大きさを変えることができる配列です。
ArrayListを使うと、友達リストや、お気に入りの本のリスト、あるいはゲームのスコアのリストなど、動的に増え続ける様なデータを保存することができます。
ArrayListクラスのメソッド
- データの追加: 新しいデータをリストに追加するときは、オブジェクト変数名.add(追加データ)という命令を使います。
- データの取り出し: リストに入っているデータを取り出すときは、オブジェクト変数名.get(インデックス番号)という命令を使います。
- データの削除: リストからデータを削除するときは、オブジェクト変数名.remove(インデックス番号)という命令を使います。
- リストの大きさを知る: リストに入っているデータの数を知りたいときは、オブジェクト変数名.size()という命令を使います。引数は空白です。
ArrayListの使い方(オブジェクト化)はどうやるの?
基本的には通常のクラスと同様の流れでインスタタンス化(オブジェクト化)します。
import java.util.ArrayList;
ArrayList<扱う型> オブジェクト変数名 = new ArrayList<扱う型>(初期サイズ);
//(初期サイズ)を空白にするとデフォルトが設定される
ArrayListクラスを使うときは、しっかりとArrayListのimport文を記載する必要があります。
しかし、もしequlipsなどのIDEを使っている場合はコードを保存すると自動でimport文を記載してくれる場合もあります。
扱う型の指定方法
扱う型を指定する時は、変数の定義法とはやや違うので注意しましょう!
- 整数型(Integer):
ArrayList<Integer>
- 浮動小数点数型(Double):
ArrayList<Double>
- 文字列型(String):
ArrayList<String>
- 文字型(Character):
ArrayList<Character>
- 真偽値型(Boolean):
ArrayList<Boolean>
- その他のオブジェクト型: 例えば、自分で定義したクラスの場合はそのクラス名を指定します。
【練習1】 ArrayListに慣れよう!
練習問題:ArrayListを使って、整数のリストを作成し、次の操作を行ってください。
- リストに整数1から10までの数値を追加します。
- リスト内の偶数をすべて削除します。
- リスト内のすべての数値を合計します。
- 合計した数値を出力します。
【回答】 ArrayListに慣れよう!
コーディングの書き方は無数にあります。
そのため、回答通りでなくても、最終的に合計値が25を示していたら正しくコーディングできている証拠です。
package practice;//パッケージ名は各々のパッケージ名を宣言してください
import java.util.ArrayList;//ArrayListを使うためにimport文を記載
public class practice {//クラス名は各々のクラス名で!
public static void main(String[] args) {
//ArrayListクラスをインスタンス化(オブジェクト化)
ArrayList<Integer> array_list = new ArrayList<>();
//1から10を格納
for(int i=1; i<=10; i++) {
array_list.add(i);//データ追加は【変数名.add(データ)】
}
//偶数を削除
for(int i=0; i<array_list.size();i++) {//【変数名.size()】で配列の個数を取得
if(array_list.get(i)%2==0) {//【変数名.get(インデックス番号)】でデータを取得
array_list.remove(i);//【変数名.remove(インデックス番号)】でデータを削除
}
}
//配列内を合計する
int sum = 0;
for(int i=0; i<array_list.size();i++) {
sum += array_list.get(i);
}
//一応、配列の中身を確認しておく
for(int i=0;i<array_list.size();i++) {
System.out.print(array_list.get(i)+",");
}
System.out.println();
System.out.println();
System.out.println("合計は"+sum+"です!");
}
}
【練習2】 ArrayListにクラスを格納&利用しよう!
【完成形イメージ↓】
問題文: 新しい図書館の図書管理システムを開発するために、以下の仕様に従ってJavaプログラムを作成してください。
- BookListクラスを作成してください。このクラスには、次のフィールドが含まれます。
- タイトル(title):書籍のタイトルを表す文字列
- 価格(price):書籍の価格を表す整数
- BookListクラスには、以下のコンストラクタとメソッドを含めてください。
- コンストラクタ:タイトルと価格を受け取り、それぞれのフィールドに設定します。
- getTitleメソッド:書籍のタイトルを返します。
- getPriceメソッド:書籍の価格を返します。
- practice02クラスを作成してください。このクラスには、mainメソッドを含めてください。
- practice02クラスのmainメソッドでは、ユーザーからの入力を受け取り、BookListオブジェクトをArrayListに格納します。
- ユーザーが0を入力すると、書籍のタイトルと価格を入力させ、それをBookListオブジェクトとしてArrayListに格納します。
- ユーザーが1を入力すると、入力を終了します。
- 入力が終了した後、ArrayListに格納された書籍の情報をすべて表示します。
以上の仕様に従って、Javaプログラムを作成してください。
骨が折れる作業ですがステップbyステップでやっていきましょう!また、コードの書き方は星の数ほどあるので、「これって正解なのかな?」と悩まずに「これが正解なんだ!これを正解にするんだ!」というテンション感で書き進めてみてください!
p.s.完成形イメージとまったく同じでなくても、流れが理解できていればいいので、そこらへんはアバウトにコーディングしていってください。
【クラス定義】public class クラス名{処理}
【オブジェクト化(インスタンス化)】クラス名 オブジェクト変数名 = new クラス名(引数)
p.s.オブジェクト化が実施されると自動的にコンストラクタが呼び出されます。
import java.util.Scanner;
Scanner sc = new Scanner(System.in)
int i = sc.nextInt();
Array_Listオブジェクト変数.get(インデックス番号).ゲッターメソッド()
ArrayListクラスのget()メソッドは指定インデックスのデータを取得するメソッド。
つまり、クラスが配列に格納されている場合は、get()メソッドを使って、初めてオブジェクト(インスタンス)が呼び出せた状態になる。
get()メソッドを使わないと、ArrayListクラスのメソッドが使用可能になるだけ。ArrayListに格納したクラスのメソッドを使いたいならget()メソッドで、クラスオブジェクトを呼び出す必要がある。
【回答】 ArrayListにクラスを格納&利用しよう!
//practice02.javaファイル
package practice;
import java.util.ArrayList;
import java.util.Scanner;
public class practice02 {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
ArrayList<BookList> array_list = new ArrayList<>();//IntegerかStringで迷ったと思います。しかし、そのためにクラス型を指定してやれば解決です
Scanner input_num = new Scanner(System.in);
while(true) {
System.out.println("0なら続ける/1なら終了>>>");
int num = input_num.nextInt();
if(num==0) {
System.out.print("タイトルを入力してください>>>");
Scanner input_title = new Scanner(System.in);
String title = input_title.nextLine();
System.out.print("価格を入力してください>>>");
Scanner input_price = new Scanner(System.in);
int price = input_price.nextInt();
BookList book = new BookList(title,price);
array_list.add(book);
}else {
break;
}
}for(int i=0; i<array_list.size();i++) {
System.out.println("***"+(i+1)+"個目のデータ出力***");
System.out.println("タイトル:『"+array_list.get(i).getTitle()+"』");
//まず、array_list.get(i)でインスタンスを呼び出す。
//インスタンスを呼んだら、メソッドが使えるので、ゲッターメソッドを使って、フィールドを取得
System.out.println("価格:『"+array_list.get(i).getPrice()+"』");
}System.out.println("処理が終了しました");
}
}
//BookList.javaファイル
package practice;
public class BookList {
String title;
int price;
public BookList(String title,int price) {//コンストラクタ定義
this.title=title;
this.price=price;
}
public String getTitle() {
return this.title;
}
public int getPrice() {
return this.price;
}
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
}
}
おわりに
どうでしたか?理解できましたか?もし、理解できなくてもそれは、当たり前です。やっぱりプログラミングって、頭で理解ってよりも慣れ(経験)の部分が大きく作用するもです。なので、今回の練習はできようができなかろうが、経験値が増えたことには変わりありません。
経験を積めば必ず、上達はします。それは私をはじめ世界中のプログラマーが保証してくれることだと思います。なので、これからも今日の結果に一喜一憂することなく前だけ向いて悔いのないように鍛錬を積んでいきましょう!
では、今日はここで終わります!さらばじゃ!