-1

我正在尝试根据以下要求实现对象相等:

class MyObject {
  String x;
  String y;
}

1) 如果被比较的 2 个对象的两个属性都不为空,那么它们相等 if x.equals(x) && y.equals(y)

2) 如果在任何被比较的对象上至少有一个 x 为空,那么如果 y.equals(y) 则它们相等(假设两个 y 都不为空)

3) 如果在任何被比较的对象上至少有一个 y 为空,那么如果 x.equals(x) 则它们相等(假设两个 x 都是非空的)

经过几次尝试,我开始认为基于这些要求无法实现equals方法的传递关系。欢迎评论!谢谢。

4

3 回答 3

6

取这些 (x,y) 对:

根据规则,(1,2)=(1,null)=(1,3),这会让你相信(1,2)=(1,3),这是错误的。所以是的,这是不可能的。

编辑:误读规则,现已修复

于 2012-08-02T17:24:28.830 回答
1

就这三个要求来说,你是对的;你没有传递性。

举这些例子:

x = "hello", y = "mom"
x = "hello", y = null
x = "hello", y = "world"

照你说的,第一和第二相等,第二和第三相等,但第一和第三不相等。

您可能想要添加的限制是 1)如果一个 x 为空,另一个必须相同才能使它们相等,以及 2)对于 ys 相同。

于 2012-08-02T17:26:32.637 回答
0

我不太确定“如果至少有一个 y 为空”是什么意思,因此您可能需要进一步澄清这一点,但这里有一个基于我如何理解您的规范的解决方案。

public boolean yourEquals(Object x, Object y) {

    if(x != null && y != null) return x.equals(x) && y.equals(y);
    else if(x == null) return y.equals(y);
    else return x.equals(x);

}

如果我做了有缺陷的假设,请更正我的假设,但是您对问题的描述在某些地方有些难以理解。

编辑:当然,这种关系不是传递的。如上所述,与您的要求的任何关系不能传递。但这是根据您的三个规则返回布尔值的函数。

于 2012-08-02T17:25:33.620 回答