コレクション
コレクションとはデータの集合のこと。Javaにはコレクションを扱うライブラリが標準で含まれている。
よく使うコレクションとして、次の3つがある
- java.util.ArrayList
- 順序の情報を保持するコレクション。同じ要素も格納できる。
- java.util.HashSet
- 同じ要素格納できない。順序も保持できない。注: デメリットではない
- java.util.HashMap
- キーと値のペアで保持する。辞書のようなもの。
ArrayListの利用
ArrayListの後ろに中に格納するインスタンスの型を「<」と「>」で囲んで記述する。
14 |
ArrayList<String> stringList = new ArrayList<String>(); // インスタンス化 |
addメソッドで追加する。
15 16 17 18 |
stringList.add("あああ"); // 「あああ」を追加 stringList.add("いいい"); // 「いいい」を追加 stringList.add("ううう"); // 「ううう」を追加 stringList.add("いいい"); // 「いいい」を追加 |
取り出すときはgetメソッドを使う。引数として0から始まるインデックスを指定する(配列の場合と同じ)。全てを取り出すときは、for文が使える。リストの要素数(サイズ)はsizeメソッドで取得することができる。
19 20 21 22 |
for (int i=0; i<stringList.size(); i++) { // sizeメソッドで要素数が取得できる String s = stringList.get(i); // getメソッドでi番目の要素を取得する。 System.out.println(s); } |
コレクションからデータを取り出すときには、「拡張for文」を使うと簡潔に記述できる。
23 24 25 |
for (String e : stringList) { // 拡張for文 System.out.println(e); } |
自作のクラスのインスタンスを格納する場合も同様。
19 20 21 22 |
for (int i=0; i<stringList.size(); i++) { // sizeメソッドで要素数が取得できる String s = stringList.get(i); // getメソッドでi番目の要素を取得する。 System.out.println(s); } |
HashSetの利用
ArrayListと同様に利用出来るが、以下の違いがある。
- 要素が順番に並んでるわけではないので、getメソッドが使えない。取り出すときは拡張for文で取り出す(他の方法としてIteratorを使う方法等があるが本講義では扱わない)。
- 同じ要素は1つだけ格納される。下記のソースコードの場合、出力は3つになる。
36 37 38 39 40 41 42 43 |
HashSet<String> stringSet = new HashSet<String>(); stringSet.add("あああ"); // 「あああ」を追加 stringSet.add("いいい"); // 「いいい」を追加 stringSet.add("ううう"); // 「ううう」を追加 stringSet.add("いいい"); // 「いいい」を追加 for (String s : stringSet) { // getは使えない。拡張forで取得する System.out.println(s); // 「いいい」は1回しか表示されない } |
格納する型(クラス)によっては、意図した通りにならない場合がある。例えば自作のPersonクラスの場合、「たろう」が2回、取り出されてしまう。これは、それぞれの「たろう」を表すインスタンスが「同じ」とみなされていないから、である。
「どうしたら意図したように動作するのか?」はまた後日解説するので、とりあえず、ここでは「HashSetが格納するのがStringのインスタンスなら大丈夫」と覚えておこう。
46 47 48 49 50 51 52 |
HashSet<Person> personSet = new HashSet<Person>(); personSet.add(new Person("たろう", 70.0, 1.70)); personSet.add(new Person("じろう", 75.0, 1.74)); personSet.add(new Person("たろう", 70.0, 1.70)); for (Person p : personSet) { p.selfIntroduction(); // 「じろう」は1回、「たろう」は2回、selfIntroductionメソッドが実行される。 } |
HashMapの利用
キー(key)と値(value)のペアで格納することができる。つまり辞書のようにデータを格納することができる。keyはSetで管理されるので、同じkeyを使って別の値を格納することはできないので注意。
インスンタンス化時、格納する型はkeyとvalueのそれぞれ指定する。
55 |
HashMap<String, String> dictionary = new HashMap<String, String>(); |
putメソッドで格納する。addメソッドではない点に注意。
56 57 |
dictionary.put("hello", "こんにちは"); // 「hello」と「こんにちは」のペアを追加 dictionary.put("world", "世界"); // 「world」と「世界」のペアを追加 |
取得はgetメソッドだが、インデックスではなく、keyを引数にする。
58 59 |
String s = dictionary.get("hello"); // 「hello」に対応する日本語を取得 System.out.println(s); |
すでに格納されているkeyでputすると、上書きされる。
60 |
dictionary.put("hello", "もしもし"); // 「hello」の対応を「もしもし」に変更(上書き) |
keyを取得したい場合は、keySetメソッドで、keyのSetを取得する。keyのSetから1つづつ取り出すのは、拡張for文を使う。
61 62 63 64 |
for (String key : dictionary.keySet()) { // keySetメソッドでキーのSetがとり出せる。 String value = dictionary.get(key); System.out.println(key +" "+value); } |
ソースコード全体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
package net.teachingprogramming.lecture05; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; /** * */ public class Main { public static void main(String[] args) { // ArrayListの例(1) Stringのインスタンスを格納する ArrayList<String> stringList = new ArrayList<String>(); // インスタンス化 stringList.add("あああ"); // 「あああ」を追加 stringList.add("いいい"); // 「いいい」を追加 stringList.add("ううう"); // 「ううう」を追加 stringList.add("いいい"); // 「いいい」を追加 for (int i=0; i<stringList.size(); i++) { // sizeメソッドで要素数が取得できる String s = stringList.get(i); // getメソッドでi番目の要素を取得する。 System.out.println(s); } for (String e : stringList) { // 拡張for文 System.out.println(e); } // ArrayListの例(2) 自作のクラス(Person)のインスタンスを格納する。 ArrayList<Person> personList = new ArrayList<Person>(); personList.add(new Person("たろう", 70.0, 1.70)); personList.add(new Person("じろう", 75.0, 1.74)); for (Person p : personList) { p.selfIntroduction(); } // HashSetの例(1) Stringのインスタンスを格納する HashSet<String> stringSet = new HashSet<String>(); stringSet.add("あああ"); // 「あああ」を追加 stringSet.add("いいい"); // 「いいい」を追加 stringSet.add("ううう"); // 「ううう」を追加 stringSet.add("いいい"); // 「いいい」を追加 for (String s : stringSet) { // getは使えない。拡張forで取得する System.out.println(s); // 「いいい」は1回しか表示されない } // HashSetの例(2) 自作のクラス(Person)のインスタンスを格納する。 HashSet<Person> personSet = new HashSet<Person>(); personSet.add(new Person("たろう", 70.0, 1.70)); personSet.add(new Person("じろう", 75.0, 1.74)); personSet.add(new Person("たろう", 70.0, 1.70)); for (Person p : personSet) { p.selfIntroduction(); // 「じろう」は1回、「たろう」は2回、selfIntroductionメソッドが実行される。 } // HashMapの例 HashMap<String, String> dictionary = new HashMap<String, String>(); dictionary.put("hello", "こんにちは"); // 「hello」と「こんにちは」のペアを追加 dictionary.put("world", "世界"); // 「world」と「世界」のペアを追加 String s = dictionary.get("hello"); // 「hello」に対応する日本語を取得 System.out.println(s); dictionary.put("hello", "もしもし"); // 「hello」の対応を「もしもし」に変更(上書き) for (String key : dictionary.keySet()) { // keySetメソッドでキーのSetがとり出せる。 String value = dictionary.get(key); System.out.println(key +" "+value); } } } |