写三角形等于方法

writing a triangle equals method

我必须编写一个代码,通过扩展几何对象的 class 创建一个三角形。然后我们必须编写一个 equals 方法来与三角形进行比较。我不确定如何调用另一个三角形来比较它。

    public class Triangle extends GeometricObject {
private double side1 ;
private double side2 ;
private double side3 ;
public final double DEFAULT = 1.0;

public Triangle(){
    super();
    side1= DEFAULT;
    side2= DEFAULT;
    side3= DEFAULT;
}
public Triangle(String color, boolean filled, double side1, double side2, double side3)throws IllegalTriangleException{
    super(color,filled);
    this.side1=side1;
    this.side2=side2;
    this.side3=side3;
    if (side1>=side2+side3||side2>=side1+side3|| side3>=side1+side2){
        throw new IllegalTriangleException(side1,side2,side3);
    }
}
public double getSide1() {
    return side1;
}
public void setSide1(double side1) {
    this.side1 = side1;
}
public double getSide2() {
    return side2;
}
public void setSide2(double side2) {
    this.side2 = side2;
}
public double getSide3() {
    return side3;
}
public void setSide3(double side3) {
    this.side3 = side3;
}
public double getArea(double s1, double s2, double s3){
    side1= s1;
    side2= s2;
    side3= s3;
    double area = .5*(s1*s2*s3);
    return area;
}
public double getPerimeter(double s1, double s2, double s3){
    side1=s1;
    side2=s2;
    side3=s3;
    double perim = s1+s2+s3;
    return perim;
}
public String toString(){

    return super.toString()+ "triangle side 1 +"+ side1+ " side 2= "+side2+" side 3= "+side3;
}
public boolean equals(Object o){

}
  }


public class TestTriangle {
public void main (String[]args){
    try {
        GeometricObject tri1 = new Triangle ("yellow",true,1.0,1.5,1.0);
        GeometricObject tri2 = new Triangle ("red ", true, 2.0,3.7,5.0);
    } catch (IllegalTriangleException e) {
        System.out.print("invalid Side Lengths");
    }


}
}   

OP 的问题似乎是: "im not sure exactly how to call the other triangle to compare it."

这是调用 .equals() 方法以比较 2 个三角形是否相等的方法:

tri1.equals(tri2);

Apache Common 的 EqualsBuilder class 本身就很有用。但它对于学习如何编写自己的 equals 方法也很有用。

一般来说,在你的 equals 方法中,你想要:

检查输入是否为空,如果是,return false。

o == null

检查输入参数是否与"this"相同class,如果不同则returnfalse。

this.getClass() == o.getClass()

最后,比较每个实例成员变量是否相等。

this.side1 == o.side1 && this.side2 == o.side2 && this.side3 == o.side3

一个完整且更健壮的实现可能如下所示(不考虑边的顺序):

    @Override
    public boolean equals(Object o) {
        if (null == o) return false;
        if (this.getClass() != o.getClass()) return false;

        Triangle t = (Triangle)o;
        List<Double> oSides = new ArrayList<Double>();
        oSides.add(t.side1);
        oSides.add(t.side2);
        oSides.add(t.side3);
        for (Double d : oSides) {
            if (d.equals(this.side1)) {
                oSides.remove(d);
                break;
            }
        }
        for (Double d : oSides) {
            if (d.equals(this.side2)) {
                oSides.remove(d);
                break;
            }
        }
        for (Double d : oSides) {
            if (d.equals(this.side3)) {
                oSides.remove(d);
                break;
            }
        }
        return oSides.isEmpty();
    }

两个三角形相等是什么意思?这是否意味着区域相同?那似乎太松了。这是否意味着双方的顺序相同?这似乎太严格了?如果你没有更好的定义,我会不分顺序地比较每一面。

两个双打相等是什么意思?他们只需要在一个小三角洲内。

public class Triangle {
    // a small delta for comparing doubles
    private static final double DELTA = 0.00000001;

    // the sides
    private double side1;
    private double side2;
    private double side3;

    /**
     * Constructs a triangle with these sides.
     * @param side1 the first side
     * @param side2 the second side
     * @param side3 the third side
     */
    public Triangle(double side1, double side2, double side3) {
        if (side1 <= 0 || side2 <= 0 || side3 <= 0)
            throw new IllegalArgumentException("Sides must be positive.");

        this.side1 = side1;
        this.side2 = side2;
        this.side3 = side3;
    }

    /**
     * Check if each of the 3 sides are equal - regardless of order.
     */
    @Override
    public boolean equals(Object obj) {
        boolean result = false;
        if (obj instanceof Triangle) {
            Triangle that = (Triangle)obj;

            double[] sides1 = { this.side1, this.side2, this.side3 };
            Arrays.sort(sides1);

            double[] sides2 = { that.side1, that.side2, that.side3 };
            Arrays.sort(sides2);

            result = equalsDelta(sides1[0], sides2[0])
                    && equalsDelta(sides1[1], sides2[1])
                    && equalsDelta(sides1[2], sides2[2]);
        }
        return result;
    }

    /**
     * Check if these numbers are equal within a small delta.  Assumes the
     * numbers are positive - because they represent sides of a triangle.
     *
     * @param d1 the first number
     * @param d2 the second number
     * @return true if within a delta
     */
    private static boolean equalsDelta(double d1, double d2) {
        double diff = (d1 < d2) ? d2 - d1 : d1 - d2;
        return diff < DELTA;
    }

    // hashCode(), toString(), and so on...
}