我有下面的类,使用apache commons compareTo()。我想用我自己在compareTo()中的实现来替换它。当我按照下面列出的方法进行替换时,我开始得到重复的密钥。
我开始得到java.lang.IllegalArgumentException:多个条目具有相同的键:....
我没有在任何类中修改等号或hashcode方法。
是我的compareTo()实现错误吗?
class key {
private final PrimaryKeyInfo keyInfo;
private final String value;
// ommitting constructor details
.............
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Key key = (Key) o;
if (keyInfo != null ? !keyInfo.equals(key.keyInfo) : key.keyInfo != null) return false;
return value != null ? value.equals(key.value) : key.value == null;
}
@Override
public int hashCode() {
int result = keyInfo != null ? keyInfo.hashCode() : 0;
result = 31 * result + (value != null ? value.hashCode() : 0);
return result;
}
@Override
public int compareTo(Key o) {
return new CompareToBuilder()
.append(keyInfo, o.keyInfo)
.append(value, o.value)
.toComparison();
}
}
}
//我用下面的替换了上面的compareTo()方法
@Override
public int compareTo(Key o) {
if (this == o){
return 0;
}
if(keyInfo.equals(o.keyInfo)){
return value.compareTo(o.value);
} else{
return keyInfo.compareTo(keyInfo);
}
}
后,误差
我开始得到java.lang.IllegalArgumentException:多个条目具有相同的键:....
另外添加PrimaryKeyInfo类作为参考
public class PrimaryKeyInfo implements Comparable<PrimaryKeyInfo> {
private final DataType dataType; //Just a enum of data types
private final String name;
// ommitting constructor details
.............
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PrimaryKeyInfo that = (PrimaryKeyInfo) o;
if (dataType != that.dataType) return false;
return name.equals(that.name);
}
@Override
public int hashCode() {
int result = dataType.hashCode();
result = 31 * result + name.hashCode();
return result;
}
@Override
public int compareTo(PrimaryKeyInfo o) {
return new CompareToBuilder()
.append(dataType, o.dataType)
.append(name, o.name)
.toComparison();
}
}
这是一个简单的打字错误:
return keyInfo.compareTo(keyInfo);
应:
return keyInfo.compareTo(o.keyInfo);