エンジニアの将来って?

現在6年目の元COBOL現Javaエンジニアが、将来への考えや勉強のアウトプット、たまに腎臓について書くブログです

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

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

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

TreeSetとは

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

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

f:id:Tairax:20180725072157p:plain

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

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

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

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

特徴その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:要素の重複を許さないです。

特徴その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:要素が自動でソートされるです。

特徴その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は使う機会が少ないですが、特徴くらいは覚えておいて損はないかと思います。
この記事が皆さんのご参考になれば幸いです。

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

 

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

私が基本情報処理試験に合格したときの勉強方法をご紹介します!

EVMとは?情報処理試験の午前問題で出された問題もまとめました!

Java8で追加されたラムダ式のflatMapメソッドを使ってみる