ツリーセットは、自然な並べ替えとカスタムソートの2つの並べ替え方法をサポートしています。 Treesetは、デフォルトで自然なソートを使用します。
1。自然なソート
Treesetは、コレクション要素の比較(オブジェクトOBJ)メソッドを呼び出して、要素間のサイズの関係を比較し、昇順でコレクション要素をアレンジします。 (比較のためのPresponse:2つのオブジェクトのタイプは同じです)。
Javaは、インターフェイスを実装するクラスを実装する整数値を返す比較(オブジェクトOBJ)メソッドを定義する同等のインターフェイスを提供します。オブジェクトが別のオブジェクト、たとえばOBJ1.comParto(obj2)と比較する方法を呼び出す場合、メソッドが0を返す場合、2つのオブジェクトが等しい場合、obj1がより大きいことを意味します。 OBJ2;メソッドが返された場合、負の整数を返すことはOBJ2よりも少ないことを意味します。
一般的なJavaクラスは、同等のインターフェイスを実装し、比較サイズの標準を提供します。同等のインターフェイスを実装する一般的なクラス:
オブジェクトをツリーセットに追加しようとする場合、オブジェクトのクラスは同等のインターフェイスを実装する必要があります。
次のプログラムでエラーが報告されます。
クラスerr {} public class testtreeseTerror {public static void main(string [] args){new treeset(); add(new err());説明:
上記のプログラムは、2つのERRオブジェクトを最初のオブジェクトに追加しようとします。オブジェクトの)メソッドはコレクション内の他の要素と比較されます - 対応するクラスが同等のインターフェイスを実装していない場合、ClassCastExceptionが発生します。さらに、ツリーセットから要素の最初の要素を削除しようとすると、ClassCastException例外が引き続き発生します。
比較(オブジェクトOBJ)メソッドを使用してオブジェクトを比較する場合、同じクラスの2つのインスタンスのみがサイズを比較できるため、比較オブジェクトOBJのタイプを同じタイプにキャストする必要があります。つまり、ツリーセットに追加されたオブジェクトは同じクラスである必要があります。そうしないと、ClassCastExceptionが発生します。たとえば、Stringオブジェクトをツリーセットに追加する場合、この操作は完全に正常です。 2番目の日付オブジェクトを追加すると、Treesetはオブジェクトの比較(オブジェクトOBJ)メソッドを呼び出してコレクション内の他の要素と比較し、この時点でプログラムは例外をスローします。
実際のプログラミングでは、ユーザー定義のクラスがこのインターフェイスを実装するときに、複数のタイプのオブジェクトをツリーセットに追加するために独自のクラスを定義できます。 。 変換する。ただし、ツリーセットでコレクションデータを操作する場合、ClassCastExceptioの例外は、異なるタイプの要素に対して引き続き発生します。 (注意深く読んだ後に理解するでしょう)
オブジェクトがTreesetコレクションに追加されると、Treesetはオブジェクトの比較(オブジェクトOBJ)メソッドを呼び出して、コンテナ内の他のオブジェクトとサイズを比較し、赤と黒のツリーアルゴリズムに基づいてストレージの場所を決定します。 2つのオブジェクトが比較(オブジェクトOBJ)によって等しく比較される場合、Treesetはそれらを同じ場所に保存すると見なします。
ツリーセットコレクションの場合、2つのオブジェクトが等しくないことを決定するための基準は次のとおりです。2つのオブジェクトは、等しいメソッド比較または比較(オブジェクトOBJ)の比較を介してfalseを返します。 2つのオブジェクトとしても処理されます。
次のプログラムは次のように示しています。
//等しいメソッドを書き直し、常にfalseを返します。 } public boolean equals(object obj){return false; z z1 = new z(6); set);また、9 system.out.println((z)(set.last())。プログラムの実行結果:
真実
[treeset.z@1fb8ee3、treeset.z@1fb8ee3]
9
説明:
Z1オブジェクトのequalsメソッドは常にfalsを返すため、プログラムに同じオブジェクトが2回追加され、比較(オブジェクトOBJ)メソッドは常に1を返します。このようにして、TreesetはZ1オブジェクトがそれ自体とは異なると考えるので、2つのZ1オブジェクトをTreesetに追加します。 Treesetオブジェクトによって保存された2つの要素は、実際には同じ要素です。したがって、ツリーセットコレクションの最初の要素の年齢属性を変更した後、Treesetコレクションの最後の要素の年齢属性も変わります。
概要:オブジェクトをツリーセットに入れ、オブジェクトの対応するクラスのequalsメソッドを書き換える必要がある場合、このメソッドが比較(オブジェクトOBJ)メソッドで一貫した結果を持っていることを確認する必要があります2つのオブジェクトは、等しいメソッド比較がtrueを返す場合、2つのオブジェクトは比較(オブジェクトOBJ)メソッドを比較して0を返す必要があります。
2つのオブジェクトがEqualsメソッドで比較されますが、2つのオブジェクトが比較(オブジェクトOBJ)メソッドによって比較され、0を返さない場合、これによりツリーセットが異なる場所に2つのオブジェクトを保存します。正常に追加されます。これは、セットコレクションのルールとは少し異なります。
2つのオブジェクトが比較(オブジェクトOBJ)メソッドを比較することで0を返しますが、等しい方法を比較することでfalseを返します。2つのオブジェクトは比較(オブジェクトOBJ)メソッドを比較することと等しく比較されるため、Treesetはそれらを保存しようとします。同じ場所ですが、実際には機能しません(それ以外の場合は、1つのオブジェクトが残っています)ので、処理する方が面倒です。
可変オブジェクトがツリーセットに追加され、その後のプログラムが可変オブジェクトのプロパティを変更して他のオブジェクトでサイズ順序を変更すると、ツリーセットは再度調整されず、保存する可能性があります。ツリーセットのこれら2つのオブジェクトでは、それらはEqualsメソッドを比較することでtrueを返し、比較(Object OBJ)メソッドは0を返します。
次のプログラムは次のように示しています。
クラスr {int count){this.count = count; if(r r =(r)obj; class testhashset2 {public static void main(string [] args){hashset()hs.add(new r(5)); r(9)); .iterator();なしsystem.out.println(hs); -3 rオブジェクト? " + hs.contains(new r(-3))); 5)));プログラムの実行結果:
[r(count属性:-3)、r(count属性:-2)、r(count属性:5)、r(カウント属性:9)]]
[r(count属性:20)、r(count属性:-2)、r(count属性:5)、r(カウント属性:-2)]
[r(count属性:20)、r(count属性:-2)、r(count属性:5)、r(カウント属性:-2)]
[r(count属性:20)、r(count属性:-2)、r(カウント属性:-2)]]
説明:
上記のプログラムのRオブジェクトは、等しい方法と同等のメソッドクラスの通常の書き換えです。プログラムの最初の出力が整然と整理されていることがわかります。 Rオブジェクトのカウントプロパティが変更されると、プログラムの出力結果も変更され、重複要素が含まれます。ツリーセットコレクション内の可変要素のプロパティが変更されると、オブジェクトがビューで削除されると、ツリーセットは削除されません(コレクションのオリジナルの要素は変更されていませんが、変更された要素に等しい要素が変更されます。要素は削除できません)
-2を持つRオブジェクトは、プログラムが5のRオブジェクトを削除することはできません。
概要:ハッシュセットを使用すると、これらのオブジェクトを扱うときに非常に複雑でエラーが発生しやすくなります。プログラムをより堅牢にするために、ハッシュセットとツリーセットコレクションには不変のオブジェクトのみを配置することをお勧めします。
2。カスタムソート
自然な種類のツリーセットは、コレクション要素のサイズに基づいており、ツリーセットは昇順でそれらを配置します。降順などのカスタムソートを実装する必要がある場合は、コンパレータインターフェイスを使用できます。このインターフェイスには、O1とO2のサイズを比較するために使用されるINT比較(T O1、T O2)メソッドが含まれています。
カスタマイズされたソートを実装する必要がある場合は、Treeset Collectionオブジェクトを作成するときにComparatorオブジェクトを提供し、Treesetコレクションに関連付けるコンパレータオブジェクトを提供する必要があり、Comparatorオブジェクトはコレクション要素のソートロジックを担当します。
次のプログラムは次のように示しています。
クラスM {int age){this.age = age; main(string [] args){treeset ts = new treeset(new Comparator(){public int Compare(Object o1、object o2){m m1 =(m)o1; m m2 =(m)o2; if(m1。 age> m2.age){return -1; Ts.Add(-3);プログラムの実行結果:
[Mオブジェクト(年齢:9)、Mオブジェクト(年齢:5)、Mオブジェクト(年齢:-3)]
説明:
上記のプログラムは、TSコレクションのソートを担当するコンパレータインターフェイスの匿名の内部クラスオブジェクトを作成します。したがって、TSコレクションにMオブジェクトを追加すると、Mクラスが同等のインターフェイスを実装する必要はありません。現時点では、TreesetはMオブジェクトを介してサイズを比較する必要がないため、Treesetに関連付けられた比較オブジェクトを介してサイズを比較する必要はありません。コレクション要素のソートを担当します。カスタムソートを使用する場合、Treesetはコレクション要素自体のサイズに関係なくコレクション要素をソートしますが、コンパレータオブジェクトはコレクション要素のソートルールに責任があります。