たなかのJava日記

どんなことをやったか(学んだか)、どこで詰まったか(わからなかったか)、どこで工夫したかの記録です。

【Java】コレクションクラス(Set関連クラス)

【今回学ぶこと】
・コレクションとは何かを復習する
・コレクションクラス(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() + "種類です。");

        // TreeSetだと、書順で取り出すことができる
        for (String c : character) {
            System.out.print(c + "⇒");
        }
    }
}

実行結果:
キャラクターは5種類です。
しずかちゃん⇒のび太ジャイアンスネ夫ドラえもん

String型の複数の文字列でTreeSetに格納しました。
簡単に「辞書順」で取り出すことができます。


【まとめ】
利用すべきSetの選び方は以下になります。

格納したいデータが単独情報の集まりで、データの重複がありえなくて、
取り出す順序が不問なら、
⇒「HashSet」

格納したいデータが単独情報の集まりで、データの重複がありえなくて、
⇒「LinkedHashSet」

格納したいデータが単独情報の集まりで、データの重複がありえなくて、
⇒「TreeSet」