Java TreeSet クラスは、ストレージにツリーを使用する Set インターフェイスを実装します。 AbstractSet クラスを継承し、NavigableSet インターフェイスを実装します。 TreeSet クラスのオブジェクトは昇順に格納されます。
Java TreeSet クラスに関する重要な点は次のとおりです。
- Java TreeSet クラスには、HashSet のような固有の要素のみが含まれます。
- Java TreeSet クラスのアクセスと取得時間は非常に速くなります。
- Java TreeSet クラスでは null 要素は許可されません。
- Java TreeSet クラスは同期されていません。
- Java TreeSet クラスは昇順を維持します。
- Java TreeSet クラスには、HashSet のような固有の要素のみが含まれます。
- Java TreeSet クラスのアクセスと取得時間は非常に高速です。
- Java TreeSet クラスでは null 要素は許可されません。
- Java TreeSet クラスは非同期です。
- Java TreeSet クラスは昇順を維持します。
- TreeSet では、比較可能なジェネリック タイプのみを許可できます。たとえば、Comparable インターフェイスは StringBuffer クラスによって実装されています。
TreeSet クラスの内部動作
TreeSet は、赤黒ツリーと同様に自己均衡を保つ二分探索ツリーを使用して実装されています。したがって、検索、削除、追加などの操作には O(log(N)) 時間がかかります。この背後にある理由は、自己バランスツリーにあります。これは、前述のすべての操作でツリーの高さが O(log(N)) を超えないことを保証するためにあります。したがって、ソートされた大きなデータを保持し、それに対して操作を実行するためには、効率的なデータ構造の 1 つです。
文字列をJavaの整数に変換
TreeSet クラスの同期
すでに上で述べたように、TreeSet クラスは同期されていません。これは、複数のスレッドがツリー セットに同時にアクセスし、アクセスしているスレッドの 1 つがツリー セットを変更する場合、同期を手動で行う必要があることを意味します。これは通常、セットをカプセル化する何らかのオブジェクト同期を実行することによって行われます。ただし、そのようなオブジェクトが見つからない場合は、Collections.synchronizedSet() メソッドを使用してセットをラップする必要があります。セットへの非同期アクセスを避けるために、作成時にこのメソッドを使用することをお勧めします。次のコード スニペットも同じことを示しています。
TreeSet treeSet = new TreeSet(); Set syncrSet = Collections.synchronziedSet(treeSet);
TreeSetクラスの階層
上の図に示すように、Java TreeSet クラスは NavigableSet インターフェイスを実装します。 NavigableSet インターフェイスは、SortedSet、Set、Collection、および Iterable インターフェイスを階層順に拡張します。
TreeSet クラスの宣言
java.util.TreeSet クラスの宣言を見てみましょう。
public class TreeSet extends AbstractSet implements NavigableSet, Cloneable, Serializable
Java TreeSet クラスのコンストラクター
コンストラクタ | 説明 |
---|---|
ツリーセット() | これは、ツリー セットの自然な順序に従って昇順で並べ替えられる空のツリー セットを構築するために使用されます。 |
ツリーセット(コレクションc) | これは、コレクションの要素を含む新しいツリー セットを構築するために使用されます。 c. |
TreeSet(コンパレータコンパレータ) | これは、指定されたコンパレータに従ってソートされる空のツリー セットを構築するために使用されます。 |
TreeSet(SortedSet) | これは、指定された SortedSet の要素を含む TreeSet を構築するために使用されます。 |
Java TreeSetクラスのメソッド
方法 | 説明 |
---|---|
ブール値 add(E e) | 指定された要素がまだ存在しない場合に、このセットに追加するために使用されます。 |
ブール値 addAll(コレクション c) | これは、指定されたコレクション内のすべての要素をこのセットに追加するために使用されます。 |
E天井(イーシー) | セット内の指定された要素と等しいか最も近い最大の要素を返すか、そのような要素が存在しない場合は null を返します。 |
コンパレータ コンパレータ() | 要素を順番に配置するコンパレータを返します。 |
イテレータdecendingIterator() | 要素を降順で反復するために使用されます。 |
NavigableSet 降順セット() | 要素を逆の順序で返します。 |
Eフロア(イーエ) | セット内の指定された要素と等しいか最も近い最小要素を返すか、そのような要素が存在しない場合は null を返します。 |
SortedSet headSet(E toElement) | 指定された要素より小さい要素のグループを返します。 |
NavigableSet headSet(E toElement、ブール値を含む) | 指定された要素以下の要素のグループを返します (包括的が true の場合)。 |
E より高い (E e) | セットから指定された要素に最も近い最大の要素を返すか、そのような要素が存在しない場合は null を返します。 |
イテレータ iterator() | 要素を昇順で反復するために使用されます。 |
E下(E e) | セットから指定された要素に最も近い最小要素を返すか、そのような要素が存在しない場合は null を返します。 |
EpollFirst() | これは、最下位 (最初の) 要素を取得して削除するために使用されます。 |
EpollLast() | これは、最上位 (最後の) 要素を取得して削除するために使用されます。 |
スプリッテレータ spliterator() | これは、要素に対する遅延バインディングおよびフェイルファスト スプリッテレーターを作成するために使用されます。 |
NavigableSet subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) | 指定された範囲の間にある要素のセットを返します。 |
SortedSet subSet(E fromElement, E toElement)) | fromElement を含み toElement を除く、指定された範囲の間にある要素のセットを返します。 |
SortedSet tailSet(E fromElement) | 指定された要素以上の要素のセットを返します。 |
NavigableSet tailSet(E fromElement、ブール値を含む) | これは、指定された要素以上の要素のセットを返します (inclusive が true の場合)。 |
ブール値には (オブジェクト o) が含まれます | このセットに指定された要素が含まれている場合は true を返します。 |
ブール値 isEmpty() | このセットに要素が含まれていない場合は true を返します。 |
ブール値の削除(オブジェクトo) | 指定された要素が存在する場合、このセットからそれを削除するために使用されます。 |
ボイドクリア() | このセットからすべての要素を削除するために使用されます。 |
オブジェクトクローン() | この TreeSet インスタンスの浅いコピーを返します。 |
Eファースト() | 現在このソートされたセット内の最初 (最下位) の要素を返します。 |
E 最後() | 現在このソートされたセット内の最後の (最上位の) 要素を返します。 |
int サイズ() | このセット内の要素の数を返します。 |
Java ツリーセットの例
Java ツリーセットの例 1:
Java TreeSet の簡単な例を見てみましょう。
ファイル名: TreeSet1.java
import java.util.*; class TreeSet1{ public static void main(String args[]){ //Creating and adding elements TreeSet al=new TreeSet(); al.add('Ravi'); al.add('Vijay'); al.add('Ravi'); al.add('Ajay'); //Traversing elements Iterator itr=al.iterator(); while(itr.hasNext()){ System.out.println(itr.next()); } } }今すぐテストしてください
出力:
Ajay Ravi Vijay
Java ツリーセットの例 2:
降順で要素を走査する例を見てみましょう。
ファイル名: ツリーセット2.java
import java.util.*; class TreeSet2{ public static void main(String args[]){ TreeSet set=new TreeSet(); set.add('Ravi'); set.add('Vijay'); set.add('Ajay'); System.out.println('Traversing element through Iterator in descending order'); Iterator i=set.descendingIterator(); while(i.hasNext()) { System.out.println(i.next()); } } }今すぐテストしてください
出力:
AndroidでYouTubeの広告をブロックする方法
Traversing element through Iterator in descending order Vijay Ravi Ajay Traversing element through NavigableSet in descending order Vijay Ravi Ajay
Java ツリーセットの例 3:
最高値と最低値を取得して削除する例を見てみましょう。
ファイル名: ツリーセット3.java
import java.util.*; class TreeSet3{ public static void main(String args[]){ TreeSet set=new TreeSet(); set.add(24); set.add(66); set.add(12); set.add(15); System.out.println('Lowest Value: '+set.pollFirst()); System.out.println('Highest Value: '+set.pollLast()); } }
出力:
Java文字列のフォーマット
Lowest Value: 12 Highest Value: 66
Java ツリーセットの例 4:
この例では、さまざまな NavigableSet 操作を実行します。
ファイル名: ツリーセット4.java
import java.util.*; class TreeSet4{ public static void main(String args[]){ TreeSet set=new TreeSet(); set.add('A'); set.add('B'); set.add('C'); set.add('D'); set.add('E'); System.out.println('Initial Set: '+set); System.out.println('Reverse Set: '+set.descendingSet()); System.out.println('Head Set: '+set.headSet('C', true)); System.out.println('SubSet: '+set.subSet('A', false, 'E', true)); System.out.println('TailSet: '+set.tailSet('C', false)); } }
出力:
Initial Set: [A, B, C, D, E] Reverse Set: [E, D, C, B, A] Head Set: [A, B, C] SubSet: [B, C, D, E] TailSet: [D, E]
Java ツリーセットの例 5:
この例では、さまざまな SortedSetSet 操作を実行します。
ファイル名: ツリーセット5.java
import java.util.*; class TreeSet5{ public static void main(String args[]){ TreeSet set=new TreeSet(); set.add('A'); set.add('B'); set.add('C'); set.add('D'); set.add('E'); System.out.println('Intial Set: '+set); System.out.println('Head Set: '+set.headSet('C')); System.out.println('SubSet: '+set.subSet('A', 'E')); System.out.println('TailSet: '+set.tailSet('C')); } }
出力:
Intial Set: [A, B, C, D, E] Head Set: [A, B] SubSet: [A, B, C, D] TailSet: [C, D, E]
Java TreeSet の例: 書籍
セットに書籍を追加し、すべての書籍を印刷する TreeSet の例を見てみましょう。 TreeSet 内の要素は Comparable タイプである必要があります。 String クラスと Wrapper クラスはデフォルトで Comparable です。 TreeSet にユーザー定義オブジェクトを追加するには、Comparable インターフェイスを実装する必要があります。
ファイル名: TreeSetExample.java
import java.util.*; class Book implements Comparable{ int id; String name,author,publisher; int quantity; public Book(int id, String name, String author, String publisher, int quantity) { this.id = id; this.name = name; this.author = author; this.publisher = publisher; this.quantity = quantity; } // implementing the abstract method public int compareTo(Book b) { if(id>b.id){ return 1; }else if(id <b.id){ return -1; }else{ 0; } public class treesetexample { static void main(string[] args) set treeset(); creating books book b1="new" book(121,'let us c','yashwant kanetkar','bpb',8); b2="new" book(233,'operating system','galvin','wiley',6); b3="new" book(101,'data communications & networking','forouzan','mc graw hill',4); adding to treeset set.add(b1); set.add(b2); set.add(b3); traversing for(book b:set){ system.out.println(b.id+' '+b.name+' '+b.author+' '+b.publisher+' '+b.quantity); < pre> <p> <strong>Output:</strong> </p> <pre>101 Data Communications & Networking Forouzan Mc Graw Hill 4 121 Let us C Yashwant Kanetkar BPB 8 233 Operating System Galvin Wiley 6 </pre> <h3>ClassCast Exception in TreeSet</h3> <p>If we add an object of the class that is not implementing the Comparable interface, the ClassCast Exception is raised. Observe the following program.</p> <p> <strong>FileName:</strong> ClassCastExceptionTreeSet.java</p> <pre> // important import statement import java.util.*; class Employee { int empId; String name; // getting the name of the employee String getName() { return this.name; } // setting the name of the employee void setName(String name) { this.name = name; } // setting the employee id // of the employee void setId(int a) { this.empId = a; } // retrieving the employee id of // the employee int getId() { return this.empId; } } public class ClassCastExceptionTreeSet { // main method public static void main(String[] argvs) { // creating objects of the class Employee Employee obj1 = new Employee(); Employee obj2 = new Employee(); TreeSet ts = new TreeSet(); // adding the employee objects to // the TreeSet class ts.add(obj1); ts.add(obj2); System.out.println('The program has been executed successfully.'); } } </pre> <p>When we compile the above program, we get the ClassCastException, as shown below.</p> <pre> Exception in thread 'main' java.lang.ClassCastException: class Employee cannot be cast to class java.lang.Comparable (Employee is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap') at java.base/java.util.TreeMap.compare(TreeMap.java:1569) at java.base/java.util.TreeMap.addEntryToEmptyMap(TreeMap.java:776) at java.base/java.util.TreeMap.put(TreeMap.java:785) at java.base/java.util.TreeMap.put(TreeMap.java:534) at java.base/java.util.TreeSet.add(TreeSet.java:255) at ClassCastExceptionTreeSet.main(ClassCastExceptionTreeSet.java:52) </pre> <p> <strong>Explanation:</strong> In the above program, it is required to implement a Comparable interface. It is because the TreeSet maintains the sorting order, and for doing the sorting the comparison of different objects that are being inserted in the TreeSet is must, which is accomplished by implementing the Comparable interface.</p> <hr></b.id){>
TreeSet の ClassCast 例外
Comparable インターフェイスを実装していないクラスのオブジェクトを追加すると、ClassCast 例外が発生します。次のプログラムを観察してください。
755chmod
ファイル名: ClassCastExceptionTreeSet.java
// important import statement import java.util.*; class Employee { int empId; String name; // getting the name of the employee String getName() { return this.name; } // setting the name of the employee void setName(String name) { this.name = name; } // setting the employee id // of the employee void setId(int a) { this.empId = a; } // retrieving the employee id of // the employee int getId() { return this.empId; } } public class ClassCastExceptionTreeSet { // main method public static void main(String[] argvs) { // creating objects of the class Employee Employee obj1 = new Employee(); Employee obj2 = new Employee(); TreeSet ts = new TreeSet(); // adding the employee objects to // the TreeSet class ts.add(obj1); ts.add(obj2); System.out.println('The program has been executed successfully.'); } }
上記のプログラムをコンパイルすると、以下に示すように ClassCastException が発生します。
Exception in thread 'main' java.lang.ClassCastException: class Employee cannot be cast to class java.lang.Comparable (Employee is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap') at java.base/java.util.TreeMap.compare(TreeMap.java:1569) at java.base/java.util.TreeMap.addEntryToEmptyMap(TreeMap.java:776) at java.base/java.util.TreeMap.put(TreeMap.java:785) at java.base/java.util.TreeMap.put(TreeMap.java:534) at java.base/java.util.TreeSet.add(TreeSet.java:255) at ClassCastExceptionTreeSet.main(ClassCastExceptionTreeSet.java:52)
説明: 上記のプログラムでは、Comparable インターフェイスを実装する必要があります。これは、TreeSet が並べ替え順序を維持しており、並べ替えを行うには TreeSet に挿入されているさまざまなオブジェクトの比較が必要であり、これは Comparable インターフェイスを実装することで実現されます。