0

好的,首先抱歉,如果这段代码很乱并且我的 equals() 完全错误,但这是我第一次使用它。

我正在尝试创建一个 equals 方法来检查两条线是否相等,如果两个端点相同,则两条线被定义为相等。

我的第一个问题是,我是否接近 Point 类中的方法,以及如何从 Line 类中调用 Point 类中的 equals() 方法?

感谢您的任何帮助。

public class Point {

private int x;
private int y;

public Point( int x, int y) {
    this.x = x;
    this.y = y;
}

public int getX() {
    return x;
}
public int getY() {
    return y;
}

public String toString() {
    return "x=" + x + ", y=" + y;
}

public boolean equals(Object o) {
      if (!(o instanceof Point)) {
            return false;
        }
        return (x == ((Point) o).x && y == ((Point) o).y);
}
}

}

对于返回 this.y,它显示“无法访问的代码”。我的对象也应该是“点”还是“线”?

public class Line {
private Point beg, end;
Color color;

public Line(Point beg, Point end, String color) {
    this.beg = beg;
    this.end = end;


public Point getEnd() {
    return end;
}

public Point getBeg() {
    return beg;
}

public Color getColor() {
    return color;
}

public String toString() {
    return "Beg=" + beg + ", End=" + end + ", Color" + color.toString();
}

Line() {
    return this.beg.equals(Point.x);
    return this.end.equals(Point.y);
}

}

我更新了点类中的 equals() 但我仍然无法从 Line 类中调用它,它会是类似的修复吗?

感谢所有的帮助。

4

8 回答 8

1

这是无法访问的代码,因为您在之前通过returning 退出了该方法。你可能的意思是this.x == ((Point)o).x && this.y == ((Point)o).y

你应该有类似的东西:

@Override
public boolean equals(Object o) {
    if (o == null) {
        return false;
    }
    if (!(o instanceof Point)) {
        return false;
    }
    return (x == ((Point) o).x && y == ((Point) o).y);
}

此外,对于Line您比较相关字段(begend)的类。

@Override
public boolean equals(Object o) {
    if (o == null) {
        return false;
    }
    if (!(o instanceof Line)) {
        return false;
    }
    return (beg == ((Line) o).beg && end == ((Line) o).end);
}

当您覆盖equals(并且hashCode,总是成对编写它们)时,最好使用@Override注释,以防您错误地编写public boolean equals(Point o)(注意参数是Point,而不是Object),因此编译器会捕获它。

于 2013-09-05T14:44:33.220 回答
0

如果你覆盖 equals,你应该/必须覆盖 hashCode() !

public boolean equals(Object o) {
   if(o==this){return true;}
   if(!o instanceof Point){return false;}
   Point p = (Point)o;
   return (this.x==p.x && this.y==p.y);
}
于 2013-09-05T15:13:30.043 回答
0

它说无法访问代码,因为您的 equals() 方法将在return this.x == ((Point)o).x;

尝试使用:

public boolean equals(Object o) {
    if(this.x == ((Point)o).x && this.y == ((Point)o).y) {
        return true;
    }
    return false;
}

可以缩短为:

public boolean equals(Object o) {
    return this.x == ((Point)o).x && this.y == ((Point)o).y;
}
于 2013-09-05T14:40:58.600 回答
0

它应该是:

public class Point {
    public boolean equals(Object o) {
        return (this.x == ((Point)o).x) && (this.y == ((Point)o).y);
    }
}

这样您的代码就不会无法访问。

您还必须检查:

if (!(o instanceof Point)) return false;
于 2013-09-05T14:41:15.457 回答
0

第一次return调用后,该方法退出,因此第二个永远不会被评估。

改为使用return (this.x == ((Point)o).x) && (this.y == ((Point)o).y);

public class Point {
    public boolean equals(Object o) {
        if(o == null) return false;
        if(!(o instanceOf Point) return false;
        return (this.x == ((Point)o).x) && (this.y == ((Point)o).y);
    }
}
于 2013-09-05T14:41:25.467 回答
0

您永远不能一个接一个地拥有 2 个 return 语句,因为第二个总是无法访问。您可以改用它,评估 if xequalso.xyequals o.y

 public boolean equals(Object o) {
        return this.x == ((Point)o).x && this.y == ((Point)o).y;
    }
于 2013-09-05T14:42:02.613 回答
0

'return' 语句退出该方法,这就是为什么永远不会到达更下方的任何代码的原因。此外,最好检查传递的对象是否属于正确的类,以避免类转换异常:

public boolean equals(Object o) {
    if (o instanceof Point) {
        Point po = (Point) o;
        return this.x == po.x && this.y == po.y;
    }
    return false;
}

参数需要是 'Object' 而不是 'Point' 所以这个方法会覆盖 Object.equals 方法

于 2013-09-05T14:42:44.837 回答
0

您正在使用

return this.x == ((Point)o).x;
return this.y == ((Point)o).y;

此代码将在检查 x 后返回,但永远不会到达 y。

因此,为了使您的代码正常工作,请使用

return (this.x == ((Point)o).x)&&(this.y == ((Point)o).y);

此代码将同时检查 x 和 y 然后返回

于 2013-09-05T14:43:21.243 回答