Comparableインターフェイスを実装するときに、クラスの自然な順序付けを「equals と一致させる」方法を理解できません。プログラムに欠陥を発見したため、インターフェイスComparableのドキュメントで確認しました。私の問題は、2 つのオブジェクトが equals メソッドのベースで異なると見なされているにもかかわらず、TreeMap 構造がそれらを等しいものとして扱い、その結果、2 番目の挿入を受け入れないことです。サンプルコードは次のとおりです。
public class Car  implements Comparable<Car> {
 int weight;
 String name;
public Car(int w, String n) {
    weight=w;
    name=n;
}
public boolean equals(Object o){
    if(o instanceof Car){
        Car d = (Car)o;
        return ((d.name.equals(name)) && (d.weight==weight));
    }
    return false;
}
public int hashCode(){
    return weight/2 + 17;
}
public String toString(){
    return "I am " +name+ " !!!";
}
public int compareTo(Car d){
    if(this.weight>d.weight)
        return 1;
    else if(this.weight<d.weight)
        return -1;
    else
        return 0;
}
/*public int compareTo(Car d){
    return this.name.compareTo(d.name);
}*/
}
public static void main(String[] args) {
    Car d1 = new Car(100, "a");
    Car d2 = new Car(110, "b");
    Car d3 = new Car(110, "c");
    Car d4 = new Car(100, "a");
    Map<Car, Integer> m = new HashMap<Car, Integer>();
    m.put(d1, 1);
    m.put(d2, 2);
    m.put(d3, 3);
    m.put(d4, 16);
    for(Map.Entry<Car, Integer> me : m.entrySet())
    System.out.println(me.getKey().toString() + " " +me.getValue());
    TreeMap<Car, Integer> tm = new TreeMap<Car, Integer>(m);
    System.out.println("After Sorting: ");
    for(Map.Entry<Car, Integer> me : tm.entrySet())
        System.out.println(me.getKey().toString() + " " +me.getValue());
}
出力は次のとおりです。
I am a !!! 16
I am c !!! 3
I am b !!! 2
After Sorting: 
I am a !!! 16
I am c !!! 2
つまり、オブジェクト c がオブジェクト b を (ある程度) 置き換えたということです。元の equals メソッドをコメントし、名前に従ってオブジェクトを比較する 2 番目の equals メソッドのコメントを外すと、出力は次のようになります。
I am a !!! 16
I am c !!! 3
I am b !!! 2
After Sorting: 
I am a !!! 16
I am b !!! 2
I am c !!! 3
なぜこのようになるのですか? TreeMap に同じ値の属性を持つさまざまなオブジェクトを挿入して並べ替えるには、何を変更すればよいですか?