【今回学ぶこと】
・コレクションとは何かを復習する
・コレクションクラス(Set関連クラス)の特徴を抑え、正しく利用する
【そもそもコレクションとは何?おさらいしましょう】
データをどのようにまとめて扱うかをデータ構造と言います。
もう少し硬い言い方だと、データの集まりをコンピュータプログラムで扱いやすいように一定の形式で格納したものです。
これは、特定の問題を解く手順(アルゴリズム)には、それぞれに適したデータ構造があるためです。
Javaにはさまざまなデータ構造に対応した「データをまとめて格納するための入れ物クラスたち」が
API(標準添付されているクラス)として準備されています。
それらはjava.utilパッケージに属し、コレクションフレームワークと総称されています。
配列との違いや注意点は以下4つです。
1,import文を記述する
ArrayListクラスをはじめとするコレクションクラスはjava.utilパッケージに属しています。
通常import文を記述して利用することが一般的です。
2,<>記号を使って、格納するインスタンスの型を指定する
配列では、String[]と記述していましたが、ArrayListでは、ArrayListと記述します。<>記号を使用した表現はジェネリクスと呼ばれるJava文法の一種です。<>記号の中身を自分で作成したクラスなど、どんな種類のインスタンスでも格納することができます。
3,宣言時のサイズ指定は不要で、要素は随時追加できる
コレクションクラスは、宣言時に準備する要素数を指定しません。
なぜならデータを追加しようとした際にサイズが不足していれば、自動的に追加されているからです。
4,基本型のデータを格納する場合は、ラッパークラスを使用する
コレクションには、基本データ型(int)などの情報を格納することができません。
基本データ型の情報を中身に保持することを責務とした、ラッパークラスを使用します。
メリットは以下のサイトを参考にして下さい。
ラッパークラスの詳細:
Java ラッパークラスとは (intとIntegerの違い) | ITSakura
10-8. ラッパークラス - マンガで分かる Java入門講座 - マンガPG
【初心者でもわかる】Javaのラッパークラス!
【コレクションクラスの全体像を把握する】
大きく分けるとList関連、Set関連、Map関連の3種類です。
注意点としては、Mapは「ペアデータの集まり」であるため、
Collectionインターフェースとは継承関係にありません。
画像元サイト:
コレクション - Java入門 - IT専科
【java.util.HashSetクラスとは・・】
・java.util.Setインターフェースを実装するコレクションクラスの中で最も一般的なクラス
・Set関連クラスは複数の情報を重複なく格納する集合(セット)というデータ構造を実現するためのもの
【Setの基本特性】
・それぞれの要素には、重複が許されない
・それぞれの要素には、基本的に順序がない
・重複した値を格納しようとすると無視される
・要素を1つずつ取り出す場合の順序は不明
・set()やget()がない
⇒要素同士に順序関係が無いため、〇番目の要素といった添え字の概念はないため
package jp.co.mtanaka;
import java.util.HashSet;
import java.util.Set;
public class Sample {
public static void main(String[] args) {
Set<String> character = new HashSet<>();
character.add("ドラえもん");
character.add("のび太");
character.add("しずかちゃん");
character.add("ドラえもん");
System.out.println("キャラクターは" + character.size() + "種類です。");
for (String c : character) {
System.out.print(c + "⇒");
}
}
}
実行結果:
キャラクターは3種類です。
ドラえもん⇒しずかちゃん⇒のび太⇒
【順序が保証されるSetバリエーション】
LinkedHashSet:値を格納した順序に整列
TreeSet:自然順序付けで整列
自然順序とは、それぞれのクラス固有の順序のことです。
例えばStringクラスでは辞書順になるように定義されています。
package jp.co.mtanaka;
import java.util.Set;
import java.util.TreeSet;
public class Sample {
public static void main(String[] args) {
Set<String> character = new TreeSet<>();
character.add("ドラえもん");
character.add("のび太");
character.add("しずかちゃん");
character.add("ジャイアン");
character.add("スネ夫");
character.add("ドラえもん");
System.out.println("キャラクターは" + character.size() + "種類です。");
for (String c : character) {
System.out.print(c + "⇒");
}
}
}
実行結果:
キャラクターは5種類です。
しずかちゃん⇒のび太⇒ジャイアン⇒スネ夫⇒ドラえもん⇒
String型の複数の文字列でTreeSetに格納しました。
簡単に「辞書順」で取り出すことができます。
【まとめ】
利用すべきSetの選び方は以下になります。
格納したいデータが単独情報の集まりで、データの重複がありえなくて、
取り出す順序が不問なら、
⇒「HashSet」
格納したいデータが単独情報の集まりで、データの重複がありえなくて、
⇒「LinkedHashSet」
格納したいデータが単独情報の集まりで、データの重複がありえなくて、
⇒「TreeSet」