プログラミング Java

【Java】TreeSetの使い方(順序付けSet)

投稿日:

TreeSetの使い方

基本的な使い方はHashSetと同じなので、以下を参照下さい。
【Java】HashSetの使い方いろいろ

TreeSetは何も指定せずにインスタンスを生成すると、Collections.sortによる順序付けがなされるSetです。
ここでは、他のSetとの違いと順序付けをどのように定義するかについて説明します。

HashSet、LinkedHashSetとの違い

Set(共通仕様):重複をもたない値の集合
HashSet    :順序をもたないSet
LinkedHashSet :挿入順を保持するSet
TreeSet    :自然順序付けをもつSet。また独自の順序付けを定義可能。

TreeSetの自然順序付け

自然順序はCamparableインターフェースによって強制され、Collections.sortによる順序付けがなされます。
例えば、アルファベットを順不同で挿入しても、取り出すときは「A」から並んでいます。
数値であれば、小さい値(昇順)になっています。

これは降順にすることも可能です。
また、Comparatorを指定することで順序付けを独自に定義可能です。

実際にコードで確認します。

コードで確認

自然順序付け

アルファベットを「B→C→A」と挿入しても、取り出す際には「A→B→C」となっています。
また、数値も同様に「2→1→3」と挿入しても、「1→2→3」となっています。

降順

次は降順にする方法です。

streamは、Java SE 8から追加されたイテレーションの拡張APIです。
stream()で返されたコレクションに対し、sorted(Comparator.reverseOrder())で降順を指定します。
更に、collect(Collectors.toList())でソートした順のListにして返します。

Comparatorを指定

Comparatorを指定(lengthのみ)で定義した結果、「22」「aaa」「bbbb」は無くなっています。
これは格納される値がComparatorによって、length()だけで等価であるかを判断しているためです。
文字列長のみを判定基準にするため、「22」「aaa」「bbbb」は、
すでに格納済みの「11」「AAA」「BBBB」と等価と判断されたことで追加されませんでした。

<Java Docからの引用>
TreeSetインスタンスはそのcompareToメソッドまたはcompareメソッドを使用してすべての要素比較を実行するので、このメソッドによって等価と見なされる2つの要素は、セットの見地からすれば同じものです。
クラスTreeSet

Comparatorを指定(lengthとhashcode)のように、
hashcode()で文字列のハッシュ・コード値を算出する条件を追加すれば回避できます。
以下のように、ハッシュ・コード値は文字毎に異なる値を算出するからです。

TreeSetの使いどころ

順序付けを必要とするSet(重複のない集合)を扱いたい場合に有効と考えます。

 
最後までお読み頂き、ありがとうございました!
ご意見・ご要望がありましたら、遠慮なくコメント下さい!
もし内容が良かったらランキング評価を頂けると励みになります(^^)

ランキング評価する

-プログラミング, Java
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


関連記事

【Java入門】プリミティブ型と参照型とは?

概要 Javaのデータ型にはプリミティブ型と参照型があります。 ここではそれぞれの型はどのようにデータを保持しているのか? また、どのような種類があるのか? について学んでいきます。   プリミティブ …

【SpringBoot入門】#10~ 更新機能の実装

概要 既に登録済みの書籍情報を画面上で編集し、更新する処理を実装します。 更新した内容が反映されていることを確認するところまでを行います。   フロントエンド 更新情報のリクエスト edit.html …

Facadeパターンの使い道をコードとクラス図で説明します。

Facadeパターンはどんな役に立つか? 簡単にいうと、複数の処理のまとめ役。 なので、依頼1つでいろんな仕事をやってくれる点で役に立つ。 Facadeパターンの要件 Facadeクラスはあくまでサブ …

Eclipseでタブを半角スペースに変換する便利プラグイン!

Eclipseでタブを半角スペースに変換する便利プラグインに、 AnyEdit Toolsというものがあります。 導入方法を以下に記載致しましたので参考にして下さい。   どういうものか? …

ITエージェントが保有している案件数を比較してみました

概要 ITエージェントが保有している案件はどのくらいあるのか? また、Java案件に参画するにはどのエージェント経由が有利か? というちょっとした興味を元に調べてみました。 調査実施日:2021年5月 …

記事を探す

SpringFramworkの良書

■おすすめ教材
Javaの基本を学んだ人が、次のステップとして読む本(中級者向け)

※SpringはJavaのFrameworkの1つです。
変更のしやすさ、保守性の高さが特徴です。