所以我有这段代码:
List<MyDataType> test = map.get(id)
MyDataType test1 = new MyDataType("XXX", 1);
System.out.println(test.contains(test1)); // returns false
System.out.println(test.get(0).equals(test1)); // returns true
System.out.println(test.remove(test1)); // returns false
System.out.println(test); // still the original list
我已经覆盖了MyDataType中的.equals
和.hashCode()
方法,并且它是一致的。此外,map
的类型为ListMultimap<Long, DestQuanTuple>
(忘记在我的OP中提及此内容)。但是,电话:
map.remove(sourceContainerId, test1)
也不会修改test
。
MyDataType
类:
public class MyDataType implements Comparable<MyDataType> {
private String destination;
private int quantity;
// Constructor initializes destination and quantity
// Getters exist to get destination and quantity
public boolean equals (MyDataType other) {
boolean destinationSame = false, quantitySame = false;
destinationsame = this.getDestination().equals(other.getDestination());
Integer thisQuantity = (Integer) this.getQuantity();
Integer otherQuantity = (Integer) other.getQuantity();
quantitySame = thisQuantity.equals(otherQuantity);
return destinationSame && quantitySame;
}
public int hashCode() {
return destination.hashCode() + quantity;
}
public int compareTo(MyDataType other) {
Integer myQuantity = this.getQuantity();
if (myQuantity.compareTo(other.getQuantity()) != 0) {
return myQuantity.compareTo(otherTuple.getQuantity());
}
else {
return this.getDestination().compareTo(otherTuple.getDestination());
}
}
}
知道为什么我没有得到我想要的功能吗?
答案 0 :(得分:2)
您遇到的问题是您必须定义equals
和hashCode
一致
boolean contains(Object o)
如果此列表包含,则返回
true
指定的元素。更正式的是,当且仅当这样时才返回true
列表包含至少一个元素e
,以便(o==null ? e==null : o.equals(e))
。
合同为a.equals(b), then a.hashCode() must be same as b.hashCode().
结论,您必须覆盖equals
和hashCode
<强>更新强>
public boolean equals (MyDataType other) {
}
一定是,
@Override
public boolean equals (Object other) {
}
请注意,如果您使用覆盖注释,那么如果您有错误将无法编译,那么请使用注释!
你正在超载等于这通常不是必要的,因为它很难保持,并且在你的情况下,意外的行为成为集合使用默认equals(Object o)
,这就是为什么你有这个。
答案 1 :(得分:1)
您没有覆盖equals()
方法,实际上是超载它。
更改签名 -
@Override
public boolean equals (Object other) {
以下是正在发生的事情 -
System.out.println(test.contains(test1)); // returns false
false,因为内部调用的方法是equals(Object obj)
。
System.out.println(test.get(0).equals(test1)); // returns true
是的,因为您正在调用方法equals(MyDataType other)
。
System.out.println(test.remove(test1)); // returns false
false,因为内部调用的方法是equals(Object obj)
。
答案 2 :(得分:0)
我假设测试应该包含值为XXX和1的MyDataType?
如果是这样,您可能需要覆盖MyDataType的equals()方法,以便List.Contains()和List.Remove()在列表中查找MyDataType。如果MyDataTypes都指向内存中的同一对象,则默认的equals()方法将仅返回true。