【Set】 重複要素のないコレクション
Setとは
Setは、Listのと同様に 「データをまとめたもの」になります。
ですが、双方にはこのような違いがあります。
- Mapのようなキーと値の関連付けをしない
- インデックスが存在しない
- 同じ値のものは2つ以上持てない
SQL にある 「DISTINCT」や、「ORDER BY」 のようなイメージだと思います。
Setの使い所
以上に書いた「 同じ値のものは2つ以上持てない 」などの特性をいかし、このような使い所が考えられます。
- 商品を安い順に並べる
- 会社の部署はいくつあるのか調べる
- ポケモンのタイプは何種類あるか調べる
- この学校の生徒はどこの出身者がいるかみる。
といったとき Set が役立つのではないかと思います。
Setの種類
Setインタフェースを実装するものには、HashSetクラス
, TreeSetクラス
, LinkedHashSetクラス
などがあります。
それぞれの配列の並べ方は以下にです。
クラス | 概要 | 要素の並び ( 1 ~ 5 の値が格納されている場合) |
---|---|---|
HashSet | ランダム | 2, 4, 3, 5, 1 |
TreeSet | 昇順 | 1, 2, 3, 4, 5 |
LinkedHashSet | 追加した順 | 1, 3, 4, 5, 2 |
Setの定義
Set の基本の型
Setも List、Map 等と同様の書き方ができます。
基本的な書き方は以下です。
セットインターフェース名<型> インスタンス名 = new コンストラクタ名<型>();
HashSet、TreeSet、LinkedHashSet はそれぞれ次のように定義します。
HashSet の定義
※Setの代わりに左辺を同じHashSetにしてもOK
Set<String> hashSet = new HashSet<String>();
TreeSet の定義
※Setの代わりに、左辺を同じTreeSetにしてOK
Set<String> treeSet = new TreeSet<String>();
LinkedHashSet の定義
※Set の代わりに、左辺を同じLinkedHashSet にしてもOK
Setサンプルコード
以下のコードは、各種setを用いて出力結果を比べたものです。
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
HashSet<String> vegetableSet = new HashSet<String>();
//適当に値を入れていく
vegetableSet.add("大根");
vegetableSet.add("人参");
vegetableSet.add("ブロッコリー");
vegetableSet.add("すいか");
vegetableSet.add("かぼちゃ");
System.out.println("HashSetはランダムで表示"する");
//拡張for文 で変数vs を vegetableSet から一つづつ取り出す
for (String vs : vegetableSet) {
System.out.println(vs);
}
TreeSet<String> fruitsSet = new TreeSet<String>();
//適当に値を入れていく
fruitsSet.add("もも");
fruitsSet.add("ミカン");
fruitsSet.add("りんご");
fruitsSet.add("梨");
System.out.println("TreeSet は昇降順に表示する");
for (String fs : fruitsSet) {
System.out.println(fs);
}
LinkedHashSet<String> fishSet = new LinkedHashSet<String>();
fishSet.add("カツオ");
fishSet.add("カンパチ");
fishSet.add("鯵");
fishSet.add("ブリ");
System.out.println("LinkedHashSet は追加した順に表示する");
for (String fs : fishSet) {
System.out.println(fs);
}
TreeSet<String> meetSet = new TreeSet<String>();
//適当に値を入れていく
meetSet.add("牛");
meetSet.add("豚");
meetSet.add("鹿");
meetSet.add("豚");
meetSet.add("牛");
meetSet.add("牛");
meetSet.add("牛");
meetSet.add("牛");
meetSet.add("豚");
meetSet.add("豚");
meetSet.add("羊");
meetSet.add("豚");
meetSet.add("鹿");
meetSet.add("羊");
meetSet.add("羊");
meetSet.add("豚");
meetSet.add("羊");
meetSet.add("豚");
meetSet.add("鹿");
meetSet.add("羊");
System.out.println("set には同じ値が入らないので重複分は出力されない");
for (String ms : meetSet) {
System.out.println(ms);
}
}
}
出力結果
HashSetはランダムで表示
人参
大根
すいか
かぼちゃ
ブロッコリー
TreeSet は昇降順に表示する
もも
りんご
ミカン
梨
LinkedHashSet は追加した順に表示する
カツオ
カンパチ
鯵
ブリ
set には同じ値が入らないので重複分は出力されない
牛
羊
豚
鹿
これらをうまく利用することで、システムのいろいろな表現ができそうです。
実際に手を動かしながら覚えていきたいと思います。