|
|
コレクション(ArrayList) |
H.Kamifuji . |
ここからはコレクションに使い方について解説していきます。コレクションと言うのは大きさが決まっていない配列のようなものです。大きさが決まっていませんので、プログラムの実行中に必要な分だけの数のデータを格納することが出来ます。コレクションには用途に応じて色々な種類が用意されていますがまず基本となるArrayListからです。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2021/11)では、JDK-17.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 にアップされています。一部、上位互換について、見直しを行っていきます。 |
|
まずArrayListクラスを見ていきます。ArrayListクラスは大きさが決まっていない配列と考えて下さい。ArrayListは「java.util.ArrayList」のようにjava.utilクラス内で定義されています。 ArrayListを使うには、まずArraListクラスのオブジェクトを作成します。ArrayListクラスのコンストラクタの1つは下記のようになっています。 ArrayList public ArrayList()初期容量 10 で空のリストを作成します。 大きさは変更可能なのですけど、一応初期サイズとして10個の要素が格納できるArrayListを作成してくれます。このサイズは足りなくなれば自動的に拡張されるのであまり気にする必要はありません。 オブジェクトの作成にはnew演算子を使って作成しますが、以前のバージョンのJavaでは下記のように作っていました。 ArrayList 変数名 = new ArrayList();J2SE5.0以降は下記のように作成します。 ArrayList<型%gt; 変数名 = new ArrayList<型>();クラスの後ろに"<"と">"に囲まれて型を指定する部分があります。見慣れない記述の仕方ですけどJ2SE5.0から新しく導入されたGenerics機能と呼ばれるもので、このArrayListにどのような型の値を格納するのかを指定します。 Genericsこの型の部分にはクラス名を指定します。そして要素として格納できる値は、ここで指定したクラスのオブジェクトになります。注意して頂きたいのはStringは大丈夫ですがintやfloatは指定できません。これはStringはStringクラスなのですけどintやfloatはクラスでは無く基本型と呼ばれるものだからです。そこでint型やfloat型などの基本型を扱いたい場合には、各基本型に対応したクラス(ラッパークラスといいます)が用意されていますので、それを利用します。 対応するクラス 基本型 ------------------------------ Boolean boolean Character char Byte byte Short short Integer int Long long Float float Doubule double例えば整数を格納するArrayListや、Stringを格納するArrayListを作成する場合は下記のようになります。 ArrayList 値の格納ArrayListクラスのオブジェクトを作成したら、実際に要素を追加します。ArrayListクラスで用意されている"add"メソッドを使います。add public boolean add(E o)リストの最後に、指定された要素を追加します。 パラメータ: o - リストに追加される要素 戻り値: true (Collection.add の汎用規約どおり) このメソッドを使うとリストの一番最後にデータが追加されます。 例えば文字列を格納するArrayListを作成して、要素を格納する場合は下記のようになります。 ArrayList上記は実は省略した記述となっており、下記のように書いたものと同等です。 ArrayListこのように、指定したクラスのオブジェクトをどんどん格納していきます。配列の場合は決められた数の大きさだけ要素を格納できましたが、コレクションの場合は大きさを自動的に拡張してくれますので、格納する要素の数を気にすることなく追加できます。また格納された要素は、格納された順に0から始まるインデックス番号が付けられます。 次に基本型を使う場合です。前に書いた通り、基本型はそのままでは使えませんので基本型に対応したラッパークラスを使います。例えば整数を格納したい場合には下記のようになります。 ArrayList従来はこのように記述していたのですが、こちらもJ2SE5.0からオートボクシング機能というものが出来ました。詳しい説明は省きますが、上記のような記述を簡略化して下記のように記述できるというものです。 ArrayList※Stringの場合と似ていますが、意味合いが違います。ラッパークラスと基本型を使う場合に、より簡略化して使えるようにしてくれたものです。 要素の取り出し次に格納した要素を取り出します。ArrayListクラスで用意されている"get"メソッドを使います。get public E get(int index)リスト内の指定された位置にある要素を返します。 パラメータ: index - 返される要素のインデックス 戻り値: リスト内の指定された位置にある要素 例外: IndexOutOfBoundsException - インデックスが範囲外の場合 (index < 0 || index >= size()) インデックス番号を指定して、その番号に対応した要素を取り出します。 ArrayListクラスの基本機能はこのように要素を格納し、そしてインデックス番号を指定して要素を取り出すことになります。 では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。import java.util.ArrayList; class collectionTest1{ public static void main(String args[]){ ArrayList上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd List]$ java collectionTest1 イングランド [xxxxxxxx@dddddddddd List]$ |
ArrayListクラスのオブジェクトを使用している時に、現在格納されている要素数を確認するにはArrayListクラスで用意されている"size"メソッドを使います。 size public int size()リスト内にある要素の数を返します。 戻り値: リスト内の要素数 配列と異なりArrayListクラスのオブジェクトには、いくつの要素が格納されているかは決まっていないため、このメソッドを用いて登録されている要素数を確認します。 では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。import java.util.ArrayList; class collectionTest2{ public static void main(String args[]){ ArrayList上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd List]$ java collectionTest2 登録データ数:5 日本 ブラジル イングランド ポルトガル フランス [xxxxxxxx@dddddddddd List]$ |
ArrayListクラスで用意されている他のメソッドを見ていきます。まずは既に格納されている要素を別の要素で置き換えます。ArrayListクラスで用意されている"set"メソッドを使います。 set public E set(int index, E element)リストの指定された位置にある要素を、指定された要素で置き換えます。 パラメータ: index - 置換される要素のインデックス element - 指定された位置に格納される要素 戻り値: 指定された位置に以前あった要素 例外: IndexOutOfBoundsException - インデックスが範囲外の場合 (index < 0 || index >= size()) 指定したインデックス番号に格納されている要素を新しい要素に置き換えます。 では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。import java.util.ArrayList; class collectionTest3{ public static void main(String args[]){ ArrayList上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd List]$ java collectionTest3 日本 ブラジル イングランド ポルトガル フランス 3番目の国をイタリアへ置き換えます 日本 ブラジル イタリア ポルトガル フランス [xxxxxxxx@dddddddddd List]$ |
次にArraryListクラスに登録されている要素の中から、指定した要素があるかどうかを検索してみます。ArrayListクラスで用意されている"indexOf"メソッドを使います。 indexOf public int indexOf(Object elem)equals メソッドを使って等しいかどうかを判定しながら、指定された引数と同じ内容の要素を先頭から検索します。 パラメータ: elem - オブジェクト 戻り値: リスト内で引数が最初に現れるインデックス。オブジェクトが見つからない場合は -1 検索したい要素を引数に指定すると、ArrayListクラスのオブジェクト内に格納されている要素の先頭から検索を行い、最初に見つかった要素のインデックス番号を返してくれます。 また"indexOf"メソッドは先頭から検索しますけれど、最後から検索するための"lastIndexOf"メソッドも用意されています。 lastIndexOf public int lastIndexOf(Object elem)指定されたオブジェクトがリスト内で最後に現れるインデックスを返します。 パラメータ: elem - 目的の要素 戻り値: リストで指定されたオブジェクトと一致する最後のオブジェクトのインデックス。オブジェクトが 見つからない場合は -1 使い方としては下記のような感じとなります。 ArrayListでは実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。import java.util.ArrayList; class collectionTest4{ public static void main(String args[]){ ArrayList上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd List]$ java collectionTest4 東京 大阪 東京 千葉 東京について検索します 最初のインデックス番号は 0 最後のインデックス番号は 2 [xxxxxxxx@dddddddddd List]$ |
次にArraryListクラスに登録されている要素の中から、指定したインデックス番号の要素を削除してみます。ArrayListクラスで用意されている"remove"メソッドを使います。 remove public E remove(int index)リスト内の指定された位置から要素を削除します。そして、後続の要素を左側に移動し、それぞれのインデックスから 1 を減算します。 パラメータ: index - 削除される要素のインデックス 戻り値: リストから削除した要素 例外: IndexOutOfBoundsException - インデックスが範囲外の場合 (index < 0 || index >= size()) 削除したい要素のインデックス番号を指定して要素を削除します。削除された要素の後に格納されていた要素は、自動的にインデックス番号は1ずつ減ります。(項目が削除される毎に先頭から詰めて配置しなおすということです。その為、ArrayListは項目の追加や削除が遅くなります)。 また全ての要素を削除したい場合には"clear"メソッドを使います。 clear public void clear()リストからすべての要素を削除します。この呼び出しが戻ると、このリストは空になります。 使い方としては下記のような感じとなります。 ArrayListでは実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。import java.util.ArrayList; class collectionTest5{ public static void main(String args[]){ ArrayList上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd List]$ java collectionTest5 東京 大阪 東京 千葉 2番目の項目を削除します 東京 大阪 千葉 「大阪」の項目を削除します 東京 千葉 全ての項目を削除します 現在の項目数は 0 です [xxxxxxxx@dddddddddd List]$ |
|