Setクラスとは?
複数の値を重複することなく格納するデータ構造です。格納された要素には順序が存在しないことが一般的です。
よくSetを説明する際に耳にするのが信号機を例にします。
「赤、赤、青、黄」を信号機だと思う方はいないと思います。
信号機は「赤、青、黄」の三色構成です。
3色揃っていれば順不同で信号といえます。
このような重複は許されないが、
特定のデータだけを重複なく格納したい」を満たしてくれるのがSetクラスとなっています。
Listの重複なしと考えていただけたらイメージしやすいかと思います。
SetクラスにはHashSetやTreeSetとなどのクラスを使用します。
Setで使用できるメソッド一覧
メソッド | 説明 |
---|---|
add(要素) | セットに要素を追加 |
size() | 格納されている要素数を取得 |
isEmpty() | 要素数がゼロか判定を行う |
contains(検索対象) | セットに検索対象が含まれているか判定 |
clear() | 要素をすべて削除する |
remove(要素) | 指定した内容の要素を削除する |
HashSetサンプルコード
import java.util.HaseSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
// HashSetを作成
Set<String> hs = new HashSet<String>();
// 要素を追加
hs.add("赤");
hs.add("青");
hs.add("黄");
// 赤を2度追加してみる
hs.add("赤");
System.out.println("要素数:" + hs.size());
// 指定要素の削除
hs.remove("青");
System.out.println("要素数:" + hs.size());
System.out.println(hs);
}
}
実行結果
要素数:3
要素数:2
['赤', '黄']
「赤」という要素を二度追加しましたが
重複していないです。
TreeSetサンプルコード
TreeSetは自然順序付けを行ってくれます。
自然順序付けとはクラス固有の順序のことで、
Stringクラスでは辞書順で数値だと0〜9の順となります。
import java.util.Set;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
// HashSetを作成
Set<Integer> hs = new HashSet<Integer>();
// 要素を追加
hs.add(2);
hs.add(1);
hs.add(8);
hs.add(4);
// 同じ要素を追加
hs.add(1);
System.out.println("要素数:" + hs.size());
// 指定要素の削除
hs.remove(4);
System.out.println("要素数:" + hs.size());
System.out.println(hs);
}
}
実行結果
要素数:4
要素数:3
[1, 2, 8]
TreeSetでも要素の重複がされていないことが確認できます。
また、出力結果がソートされていることも確認できます。
LinkedHashSetサンプルコード
LinkedHashSetは値を格納した順序で保持してくれます。
import java.util.Set;
import java.util.LinkedHashSet;
public class Main {
public static void main(String[] args) {
// HashSetを作成
Set<String> hs = new HashSet<String>();
// 要素を追加
hs.add("C");
hs.add("B");
hs.add("A");
hs.add("T");
// 同じ要素を追加
hs.add("B");
System.out.println("要素数:" + hs.size());
// 指定要素の削除
hs.remove("B");
System.out.println("要素数:" + hs.size());
System.out.println(hs);
}
}
実行結果
要素数:4
要素数:3
['C','A','T']
LinkedHashSetも要素の重複はされていません。
順序は格納された順序が守られていることも確認できます。
HashSet、TreeSet、LinkedHashSet3種類紹介しました。
それぞれ得意、不得意を理解して使わけましょう。
おまけ
ListをSetに変換
ListからSetに変換する場合、List内に重複データが存在すると削除されるので気をつけましょう。
import java.util.HaseSet;
import java.util.Set;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
// Listを作成
List<String> list = new ArrayList<String>();
// 要素を追加
list.add("C");
list.add("B");
list.add("A");
list.add("C");
Set<String> set = new HashSet<String>(list);
System.out.println(set);
}
}
実行結果
['B','A','C']
SetをListに変換
import java.util.HaseSet;
import java.util.Set;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
// 要素を追加
set.add("C");
set.add("B");
set.add("A");
set.add("C");
// Listを作成
List<String> list = new ArrayList<String>(set);
System.out.println(list);
}
}
実行結果
['B','A','C']