在不使用 apache CompareToBuilder 的情况下实现我自己的 compareTo()
implementing my own compareTo() without using apache CompareToBuilder
我有以下 class 使用 apache commons compareTo()。我想在 compareTo() 中用我自己的实现替换它。当我按照下面的概述进行替换时,我开始得到重复的密钥。
我开始收到 java.lang.IllegalArgumentException:具有相同密钥的多个条目:....
我没有修改任何 class 中的 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();
}
}
}
//我把上面的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);
}
}
Post这个,
错误
我开始收到 java.lang.IllegalArgumentException:具有相同密钥的多个条目:....
另外添加 PrimaryKeyInfo class 以供参考
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);
我有以下 class 使用 apache commons compareTo()。我想在 compareTo() 中用我自己的实现替换它。当我按照下面的概述进行替换时,我开始得到重复的密钥。
我开始收到 java.lang.IllegalArgumentException:具有相同密钥的多个条目:....
我没有修改任何 class 中的 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();
}
}
}
//我把上面的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);
}
}
Post这个,
错误
我开始收到 java.lang.IllegalArgumentException:具有相同密钥的多个条目:....
另外添加 PrimaryKeyInfo class 以供参考
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);