【问题标题】:Equals and CompareTo contract mismatchEquals 和 CompareTo 合同不匹配
【发布时间】:2021-11-01 01:28:47
【问题描述】:

我正在处理我的项目,需要重写 tostring、equals 和 hashcode 方法。但是在这样做之后,对象中的值没有被迭代,没有被正确搜索,我怀疑这些方法只存在问题。请查看下面的课程并帮助找出这些方法之间的合同中可能存在的问题。

public class Range implements Comparable<Range> {
    private BigDecimal first;
    private BigDecimal last;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
      Range range = (Range) o;
        return Objects.equals(first, range.first) &&
                Objects.equals(last, range.last);
    }

    @Override
    public int hashCode() {
        return Objects.hash(first, last);
    }

    @Override
    public int compareTo(Range r) {
        int value = 0;

        if (first.compareTo(r.last) > 0) {
          value = -1;
        } else if (last.compareTo(r.first) < 0) {
          value = 1;
        }

        return value;
    }
}

失败的地方是当我得到值时,类对象被保存为映射键并且值是字符串,而不是缺少值存在检查返回 true。

私有地图 maps = new TreeMap(); // findRange(range) - 返回表示 eerything 的值

【问题讨论】:

标签: java object collections equals


【解决方案1】:

范围没有自然的总排序,因为要考虑范围的开始和结束。

你必须选择与你的等价者一致的东西,比如:

  • 先比较开始:如果不相等,把开始较小的范围放在最前面;
  • 比较结束:如果不相等,则将较小端的范围放在最前面;
  • 否则,它们是相等的。

您当前的比较器正在比较 firsts 和 lasts,以及 lasts 和 firsts,但这不是您在 equals/hashCode 方法中所做的。

您需要执行以下操作:

int value;

value = first.compareTo(r.first);
if (value != 0) return value;

value = last.compareTo(r.last);
if (value != 0) return value;

return 0;

【讨论】:

  • 通过进行这些更改,如果存在值,findRange 方法现在会失败
  • @OPTIMUS 你没有展示findRange 方法。
  • 这是正常的 JPA 方法,如最后两行问题中提到的 findRange(range)
  • 我不知道你所说的“像findRange(range) 这样的普通JPA方法是什么意思。你的意思是你想找到一个范围......等于?相交?包含?邻接?输入范围?
猜你喜欢
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
相关资源
最近更新 更多