こんにちは。まるです。
Java研修のまとめも3回目になりました。
今回も頑張っていきましょう。
今回はコレクションについてまとめていきます。
コレクションとは、簡単に言ってしまえば複数のデータを一つの集合として扱うための仕組みです。
大きく分けると、以下の三種類のデータ構造があります。
List | 配列のように要素を順番に並べて格納する |
Set | 要素の値の重複を許さずに格納する |
Map | キーと値をペアとして格納する |
コレクションの特徴としては、以下の三つが挙げられます。
①importの記載が必要
コレクションクラスはjava.utilクラスに所属しているため、先にimport文を記述しておく必要があります。
②要素数の上限がない
配列と違って先に要素数を決めておく必要がないため、後から必要な分だけ要素を追加することが出来ます。
③基本データ型(プリミティブ型)の情報を格納できない
コレクションに格納できるのは参照型の要素のみです。
従って、int型などの基本データ型の要素を格納したい場合にはラッパークラスを利用する必要があります。
コレクションの形式はList、Set、Mapという区分けの中にも何種類かあるのですが、今回はその中でも利用頻度が高いArrayList、HashSet、HashMapについて見ていきます。
Listインターフェースを実装しており、配列と同様に各要素には添え字が付与されています。
以下は実際にArrayListを利用したコードです。
import java.util.ArrayList; public class Main { public static void main(String[] args) { //ArrayListを宣言 ArrayList<String> animals = new ArrayList<String>(); //要素を追加 animals.add("犬"); animals.add("猫"); animals.add("うさぎ"); //格納した要素を全て表示 for(int i = 0; i < animals.size(); i++){ System.out.println(animals.get(i)); } } }
【実行結果】
犬
猫
うさぎ
動物の名前を格納するリストを作成してみました。
ArrayListの宣言は6行目のような構文で行います。
左辺の<String>で要素がString型のリストを生成すること示し、その後ろでリストの名前は”animals”とすることを宣言しています。
<> はダイヤモンド演算子といい、右辺の<> の中身は省略可能です。
ex) ArrayList<String> animals = new ArrayList<>();
要素の追加はadd()を使用し、最初に追加された要素が添え字[0]、二番目に追加された要素が添え字[1]…という形で順番に格納されていきます。
最後のfor文ではリストに格納された要素を一つ一つ取り出して表示しています。
for文の条件式で利用されているsize()はリストの要素数を返すものです。
animalsリストには現在三つの要素が格納されているため、animals.size()は”3″となり、このfor文はanimalリストを全て参照するまでループするということになります。
要素の中身は15行目の通り、get(添え字)を利用します。
また、ArrayListは指定した箇所への格納や要素の削除も簡単に行えるので、そちらも見ていきましょう。
import java.util.ArrayList; public class Main { public static void main(String[] args) { //ArrayListを宣言 ArrayList<String> animals = new ArrayList<String>(); //要素を追加 animals.add("犬"); animals.add("猫"); animals.add("うさぎ"); //リストの添え字[1]の箇所に"りす"を追加 animals.add(1, "りす"); //リストの添え字[2]の要素を"たぬき"で上書き animals.set(2, "たぬき"); //リストの添え字[3]の要素を削除 animals.remove(3); //格納した要素を全て表示 for(int i = 0; i < animals.size(); i++){ System.out.println(animals.get(i)); } } }
【実行結果】
犬
りす
たぬき
まず、14行目ではリストの添え字が[1]の箇所に”りす”という文字を追加しています。
紛らわしいですが、配列と同様にリストの先頭の添え字は[0]からスタートになりますので、添え字[1]は先頭から二番目となります。
add()で添え字を追加した場合、元々その添え字の箇所にあった要素は後ろへ移動します。
【追加前】
添え字 | [0] | [1] | [2] | |
要素 | 犬 | 猫 | うさぎ |
【追加後】
添え字 | [0] | [1] | [2] | [3] |
要素 | 犬 | りす | 猫 | うさぎ |
17行目で利用しているset()も値を設定するメソッドですが、こればadd()とは異なり要素の上書きを行います。
そのため、元々添え字[2]の箇所に格納されてた”猫”という文字が上書きされて以下のようになります。
【追加前】
添え字 | [0] | [1] | [2] | [3] |
要素 | 犬 | りす | 猫 | うさぎ |
【追加後】
添え字 | [0] | [1] | [2] | [3] |
要素 | 犬 | りす | たぬき | うさぎ |
最後、remove()を利用して添え字が[3]の要素を削除し、最終的な結果は上の【実行結果】の通りとなります。
ちなみに、clear()を利用すれば全ての要素を一度に削除することも可能です。
Setインターフェーズを実装しており、格納される値は重複しない仕組みとなっています。
import java.util.HashSet; public class Main { public static void main(String[] args) { //HashSetを宣言 HashSet<String> animals = new HashSet<String>(); //要素を追加 animals.add("犬"); animals.add("猫"); animals.add("うさぎ"); animals.add("うさぎ"); //格納した要素を全て表示 for(String s : animals){ System.out.println(s); } } }
【実行結果】
うさぎ
犬
猫
宣言時の構文やadd()で要素を追加可能な点はArrayListと同じです。
ArrayListと異なる点は、以下の三点です。
①同じ値を格納できない
上記のコードの11・12行目では共に”うさぎ”という値を格納していますが、実行結果では1度しか表示されていません。
これは、HashSetが一つのコレクションの中に同じ値を持つことが出来ないという仕様となっており、既に格納済の値をもう一度入れようとした際にはその処理が無視されるためです。(※エラーにはなりません)
②要素の取得順が保証されない
上記のコードでは、”犬”、”猫”、”うさぎ”の順で値を格納していますが、実行結果は異なる順番となっています。
このように、先ほどのArrayListや配列とは異なり、HashSetでは要素を一つずつ取り出した際に必ず格納順で取り出せるとは限りません。
③添え字が無いため、setやgetの利用不可
HashSetには添え字が無いため、ArrayListで使用していたset()やget()という添え字を利用してコレクションにアクセスするようなメソッドは利用出来ません。
ですが、上記コードの15~17行目のように拡張for文を利用することで、全ての要素を取り出すことは可能です。
Mapインターフェーズを実装しており、キーと値をペアとして格納する仕組みとなっています。
また、値の重複は可能ですがキーの重複はNGです。
import java.util.HashMap; public class Main { public static void main(String[] args) { //HashSetを宣言 HashMap<String, String> animals = new HashMap<String, String>(); //要素を追加 animals.put("犬","Dog"); animals.put("猫","Cat"); animals.put("うさぎ","Rabbit"); //格納した要素を全て表示 for(String key : animals.keySet()){ String nameEnglish = animals.get(key); System.out.println(key + "は英語で" + nameEnglish + "です"); } } }
【実行結果】
うさぎは英語でRabbitです
猫は英語でCatです
犬は英語でDogです
宣言時、<>の中に型が二つ記述されています。先にも述べた通り、HashMapはキーと値を紐づけて格納するので、それぞれに対する型を宣言する必要があるからです。
<キーの型, 値の型>をいう順序で宣言します。今回はキーも値もString型なので、<String, String>としています。
要素の追加はput(キー, 値)という形式で行います。
そして、格納されたキーと値の取り出し方は、それぞれ以下の通りです。
・キーの取り出し:keySet()
※格納されているキーの一覧を返します。
・値の取り出し:get(キー)
これを利用しているのが、14~17行目の拡張for文です。
animals.keySet()ではこのHashMapのキーの一覧を返します。この場合だと[“犬”, “猫”, “うさぎ”]ですね。
そのため、一週目のkeyには”犬”が入りますので、15行目の値の取り出しは以下のようになります。
String nameEnglish = animals.get(“犬”);
“犬”というキーに紐づいている値は”Dog”のため、 nameEnglishという変数に”Dog”という文字列が入ります。
また、HashSetと同様こちらも要素を取り出した際の順序は保証されないため、格納順とは異なる順番で表示されることもあります。
ArrayListやHashSetよりも値の取り出しが少しややこしいですが、仕組みさえ理解してしまえば使いこなせそうですね。
データの格納方法だけで種類があり最初は戸惑いましたが、用途に合わせて使いこなせるようになれば大分スムーズにデータを扱うことができそうです。
さらっと使いこなせるよう、勉強を続けたいと思います。
今回はここまでです。
有難うございました!