实现我自己的compareTo()不使用apache CompareToBuilder



我有下面的类,使用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);

最新更新