11

javadocs forTreeSetが言うとき、それが何を意味するのか知りたい

このクラスは、TreeMap インスタンスに裏打ちされた Set インターフェイスを実装していますか?

以下の例では、メソッドを実装していませんが、Hashcode期待どおりに動作しています。つまり、オブジェクトを並べ替えることができます。Equals動作を確認するために、意図的に一貫した実装を実装していないことに注意してくださいTreeSet

import java.util.TreeSet;


public class ComparisonLogic implements Comparable<ComparisonLogic>{

String field1;
String field2;

public String toString(){
    return field1+" "+field2;
}

ComparisonLogic(String field1,String field2){
    this.field1= field1;
    this.field2= field2;

}
public boolean equal(Object arg0){
    ComparisonLogic obj = (ComparisonLogic) arg0; 

    if(this.field1.equals(obj.field1))
        return true;
    else
        return false;
}

public int compareTo(ComparisonLogic arg0){
    ComparisonLogic obj = (ComparisonLogic) arg0;   
    return this.field2.compareToIgnoreCase(obj.field2);
}

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

    ComparisonLogic x = new ComparisonLogic("Tom", "jon");
    ComparisonLogic y = new ComparisonLogic("Tom", "Ben");
    ComparisonLogic z = new ComparisonLogic("Tom", "Wik");

    TreeSet<ComparisonLogic> set = new TreeSet<ComparisonLogic>();
    set.add(x);
    set.add(y);
    set.add(z);
    System.out.println(set);
}

}

この例では、 が出力され[Tom Ben, Tom jon, Tom Wik]ます。compareToしたがって、メソッドに基づいてソートされておりhashcode()、このシナリオではメソッドは重要ではないように見えます。ただし、TreesetTreeMap でサポートされているため、内部的にソートに使用されている場合、オブジェクトのハッシュはTreeMapどのようになっていますか?TreeMap

4

4 に答える 4

5

TreeSet が内部で TreeMap を使用しているのは事実です。TreeMap は、キー オブジェクトに対して hashCode および equals メソッドを実装する必要はありません。TreeMap は、自己均衡二分探索木である赤黒木を内部的に使用します。このツリーの順序は、compareTo メソッド (キー オブジェクトが Comparable インターフェイスを実装する) または compare メソッド (TreeMap の構築中にコンパレータが定義されている場合、この場合は実際の TreeSet の場合) のいずれかを使用して維持されます。それがクリアされることを願っています。

于 2017-02-20T13:33:24.817 に答える
0

で定義されたメソッドをComparisonObject使用しています。両方のフィールドに同じ値を指定して、多数の異なる を追加してみて、何が起こるかを確認してください。hashCodeObjectComparisonLogic

于 2012-06-13T08:57:11.893 に答える