TreeSet下のデータ構造

2616 ワード

import java.util.TreeSet;

class Z implements Comparable{
    int age;

    public Z(int age) {
        super();
        this.age = age;
    }
    public boolean equals(Object obj){
        return true;
    }
    public int compareTo(Object obj){
        return -1;
    }
}
public class JiHeDemo{
    public static void main(String[] args) {
        TreeSet set=new TreeSet();
        Z z=new Z(6);
        set.add(z);
        //   true,      
        System.out.println(set.add(z));
        //     set,       
        System.out.println(set);
        //        age  
        (((Z)set.first())).age=9;
        //  set          age  ,        9
        System.out.println((((Z)set.first())).age);
    }
}
プログラム中System.out.println(set.add(z));同じ要素を再度セットに追加します.このセットの中でcompreTo方法は合計1に戻ります.equals方法はtrueに戻りますが、Setセットについてはやはりzオブジェクトと彼自身が同じではないと思います.そのため、TreeSetは2つのzオブジェクトを追加できます.実は彼が追加したのは同じ要素です.異なる位置に置くだけです.したがって、最初の要素の最後の要素を変更すると変更されます.TreeSetに可変オブジェクトを追加した後、後のプログラムが可変オブジェクトのFileを修正すると他のオブジェクトとのサイズ順序が変更されますが、TreeSetは彼らの順序を再調整しません.
import java.util.TreeSet;

class R implements Comparable {
    int count;

    public R(int count) {
        this.count = count;
    }

    @Override
    public String toString() {
        return "R [count=" + count + "]";
    }

    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj != null && obj.getClass() == R.class) {
            R r = (R) obj;
            if (r.count == this.count) {
                return true;
            }
        }
        return false;
    }

    //   compareTo  ,  count     。
    @Override
    public int compareTo(Object o) {
        // TODO Auto-generated method stub
        R r = (R) o;
        return count > r.count ? 1 : count < r.count ? -1 : 0;
    }

}

public class JiHeDemo {
    public static void main(String[] args) {
        TreeSet ts = new TreeSet();
        ts.add(new R(5));
        ts.add(new R(-3));
        ts.add(new R(9));
        ts.add(new R(-2));
        System.out.println(ts);
        R first = (R) ts.first();
        //       count    
        first.count = 20;
        R last = (R) ts.last();
        last.count = -2;
        //        TreeSet          ,      。
        System.out.println(ts);
        //   Filed          。
        System.out.println(ts.remove(new R(-2)));
        System.out.println(ts);
        //   Filed            。
        System.out.println(ts.remove(new R(5)));
        System.out.println(ts);

    }
}
TreeSetセット内の可変要素のFiledを変更すると、再削除しようとしたときに削除に失敗します.