LoginSignup
0
0

More than 3 years have passed since last update.

【Java】コレクションフレームワーク( set )

Last updated at Posted at 2020-11-28

【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も ListMap 等と同様の書き方ができます。
基本的な書き方は以下です。

セットインターフェース名<型> インスタンス名 = 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 には同じ値が入らないので重複分は出力されない
牛
羊
豚
鹿

これらをうまく利用することで、システムのいろいろな表現ができそうです。
実際に手を動かしながら覚えていきたいと思います。

参考文献・記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0