スポンサーリンク
Java

【Java】HashSetクラス setの使用方法

Java

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']