微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在不使用 apache CompareToBuilder 的情况下实现我自己的 compareTo()

如何解决在不使用 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();
    }
}

}

//我用下面的替换了上面的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: 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 举报,一经查实,本站将立刻删除。