如何解决在不使用 apache CompareToBuilder 的情况下实现我自己的 compareTo()
我有以下使用 apache commons compareto() 的类。我想用我自己在 compareto() 中的实现来替换它。当我按照下面所述进行替换时,我开始收到重复的密钥。
我开始收到 java.lang.IllegalArgumentException: Multiple entry with same key: ....
我没有修改任何类中的 equals 或 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();
}
}
}
@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: Multiple entry with same key: ....
另外添加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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。