モデルと価格の 2 つの値を含む Java Bean Car があります。
ここで、その方法でモデルのみをチェックする equals() と hashcode() をオーバーライドするとします。
public boolean equals(Object o) {
return this.model.equals(o.model);
}
public int hashCode() {
return model.hashCode();
}
これにより、配列リストに同じモデルの項目 Car が既に含まれているかどうかを確認できます (価格は関係ありません)。
List<Car> car = new ArrayList<Car>();
car.add(new Car("carA",100f));
car.add(new Car("carB",101f));
car.add(new Car("carC",110f));
System.out.println(a.contains(new Car("carB",111f)));
TRUE を返します。車はすでにあるので大丈夫です!
しかし、注文した項目を維持したいので、ArrayList は良くないと判断したので、次のように TreeSet に置き換えます。
Set<Car> car = new TreeSet<Car>(new Comparator<Car>() {
@Override
public int compare(Car car1, Car car2) {
int compPrice = - Float.compare(car1.getPrice(), car2.getPrice());
if (compPrice > 0 || compPrice < 0)
return compPrice;
else
return car1.getModel().compareTo(car2.getModel());
}});
car.add(new Car("carA",100f));
car.add(new Car("carB",101f));
car.add(new Car("carC",110f));
System.out.println(a.contains(new Car("carB",111f)));
しかし、問題があり、FALSE が返されます...なぜですか?
arrayList を使用して contains() を呼び出すと、 equals() メソッドが呼び出されるようです。しかし、コンパレータで TreeSet を使用して contains() を呼び出すと、代わりにコンパレータが使用されるようです。
なぜそれが起こるのですか?