ゲーマーときどきエンジニア

基本ゲーム記事を書いて、ときどき考えを発信するエンジニアのブログです!

【Java】TreeSetの特徴を分かりやすく解説します。

こんにちは。たいら(@tairaengineer2)です。

今回の記事はJavaのコレクションの一つであるTreeSetについて、どんな特徴があるのかというのをできるだけ分かりやすく解説していきます。

スポンサーリンク

 

前提条件:eclipseの環境

この記事では、eclipseのバージョンは

バージョン Eclipse4.7 Oxygen

を使っています。
インストールの仕方は、下の記事をご参考ください。

www.tairax.com

TreeSetとは

TreeSetとは、コレクションの一種で、HashSetの拡張クラスです。

クラス構成は下のようになっています。

f:id:Tairax:20180725072157p:plain

コレクション - Java入門 - IT専科から引用させて頂きました

TreeSetには以下のような特徴があります。

  • 要素の重複を許さない
  • 要素が自動でソートされる
  • nullの挿入を許さない

どういうことなのかというのを一つずつ見ていきます。

TreeSet特徴その1:要素の重複を許さない

要素の重複を許さない特徴を説明するプログラムが下記になります。

Javaプログラム

import java.util.Set;
import java.util.TreeSet;

/**
 *
 * TreeSetを練習するクラス
 *
 */
public class TreeSample {
    public static void main(String[] args) {
        // treeSetオブジェクトを生成
        Set<String> treeSet = new TreeSet<>();

        // 生成したtreeSetに対して、国の名前を追加
        treeSet.add("America");
        treeSet.add("France");
        treeSet.add("Japan");
        treeSet.add("Japan");
        treeSet.add("Mexico");
        treeSet.add("The United Kingdom");

        // 重複されていないかを確認
        treeSet.stream().forEach(tree -> System.out.println(tree));
    }
}

実行結果

America
France
Japan
Mexico
The United Kingdom

このようにJapanを重複して追加しても、入れられていません。
1つ目のJapanが入っているので、2つ目のJapanははじかれています。
これがTreeSetの特徴その1:要素の重複を許さないです。

TreeSet特徴その2:要素が自動でソートされる

要素が自動でソートされる特徴を説明するプログラムが下記になります。

Javaプログラム

import java.util.Set;
import java.util.TreeSet;

/**
 *
 * TreeSetを練習するクラス
 *
 */
public class TreeSample {
    public static void main(String[] args) {
        // countrySetオブジェクトを生成
        Set<String> countrySet = new TreeSet<>();

        // 生成したcountrySetに対して、国の名前を追加
        countrySet.add("Japan");
        countrySet.add("Mexico");
        countrySet.add("America");
        countrySet.add("France");
        countrySet.add("America");
        countrySet.add("The United Kingdom");

        // アルファベット順にソートされているか確認
        System.out.println("--アルファベット順を確認--");
        countrySet.stream().forEach(country -> System.out.println(country));

        // kanaSetオブジェクトを生成
        Set kanaSet = new TreeSet<>();

        // 生成したkanaSetに対して、平仮名、カタカナの名詞を追加
        kanaSet.add("つくえ");
        kanaSet.add("イス");
        kanaSet.add("テレビ");
        kanaSet.add("せんぷうき");
        kanaSet.add("ボール");
        kanaSet.add("アイス");

        // 五十音順にソートされているか確認
        System.out.println("--五十音順を確認--");
        kanaSet.stream().forEach(kana -> System.out.println(kana));
    }
}

実行結果

--アルファベット順を確認--
America
France
Japan
Mexico
The United Kingdom
--五十音順を確認--
せんぷうき
つくえ
アイス
イス
テレビ
ボール

このようにアルファベット順と、五十音順になっています。
平仮名とカタカナの場合、平仮名を優先します。
これは私が設定しているのではなく、自動でソートされてます。
これがTreeSetの特徴その2:要素が自動でソートされるです。

TreeSet特徴その3:nullの挿入を許さない

nullの挿入を許さない特徴を説明するプログラムが下記になります。

Javaプログラム

package treeSample;

import java.util.Set;
import java.util.TreeSet;

/**
 *
 * TreeSetを練習するクラス
 *
 */
public class TreeSample {
	public static void main(String[] args) {
		// countrySetオブジェクトを生成
		Set<String> countrySet = new TreeSet<>();

		// 生成したcountrySetに対して、国の名前を追加
		countrySet.add("Japan");
		countrySet.add("Mexico");
		countrySet.add("America");
		countrySet.add("France");
		countrySet.add("America");
		countrySet.add("The United Kingdom");
		// nullを入れると例外が発生するか確認
		countrySet.add(null);

		// アルファベット順か確認
		System.out.println("--アルファベット順を確認--");
		countrySet.stream().forEach(country -> System.out.println(country));
	}
}

実行結果

Exception in thread "main" java.lang.NullPointerException
	at java.util.TreeMap.put(TreeMap.java:563)
	at java.util.TreeSet.add(TreeSet.java:255)
	at treeSample.TreeSample.main(TreeSample.java:24)

24行目、つまりcountrySet.add(null);でjava.lang.NullPointerExceptionで落ちています。
これがTreeSetの特徴その3:nullの挿入を許さないです。

ちなみにですが、空は許されます。

package treeSample;

import java.util.Set;
import java.util.TreeSet;

/**
 *
 * TreeSetを練習するクラス
 *
 */
public class TreeSample {
	public static void main(String[] args) {
		// countrySetオブジェクトを生成
		Set<String> countrySet = new TreeSet<>();

		// 生成したcountrySetに対して、国の名前を追加
		countrySet.add("Japan");
		countrySet.add("Mexico");
		countrySet.add("America");
		countrySet.add("France");
		countrySet.add("America");
		countrySet.add("The United Kingdom");
		// 空を入れると例外が発生するか確認
		countrySet.add("");

		// アルファベット順か確認
		System.out.println("--アルファベット順を確認--");
		countrySet.stream().forEach(country -> System.out.println(country));
	}
}

先ほどのプログラムの違いは、コメントとnullを入れていたところに代わりに空文字を入れただけです。
では、実行してみます。

--アルファベット順を確認--

America
France
Japan
Mexico
The United Kingdom

countrySet.add("");で落ちることなく、表示されました。
また空文字はアルファベットより優先されて表示されます。

 

スポンサーリンク

 

まとめ

以上がTreeSetの特徴の解説でした!
TreeSetは使う機会が少ないですが、特徴くらいは覚えておいて損はないかと思います。
この記事があなたのご参考になれば幸いです。

ではでは~(・ω・)ノシ

 

ほかにも勉強記事を書いてます。
よければご参考ください。

【Java8】mapToObjメソッドを使ってFizzBuzz問題【ラムダ式】

【Java8】filterメソッドを解説【ラムダ式】

今までブログで書いたJavaのアウトプット記事のまとめ