写三角形等于方法

时间:2016-10-17 23:00:17

标签: java equals

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

[[ $s =~ \(()\)* ]]&&echo true||echo false

2 个答案:

答案 0 :(得分:1)

OP的问题似乎是: “我不确定如何调用另一个三角形来比较它。”

这就是你如何调用.equals()方法来比较2个三角形的相等性:

o == null

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

通常,在您的equals方法中,您希望:

检查输入是否为空,如果是,则返回false。

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

检查输入参数是否与“this”属于同一类,如果不是则返回false。

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 static void Serialize(object obj, FileInfo destination)
{
    if (null != obj)
    {
        using (TextWriter writer = new StreamWriter(destination.FullName, false))
        {
            XmlTextWriter xmlWriter = null;
            try
            {
                xmlWriter = new XmlTextWriter(writer);
                DataContractSerializer formatter = new DataContractSerializer(obj.GetType());
                formatter.WriteObject(xmlWriter, obj);
            }
            finally
            {
                if (xmlWriter != null)
                {
                    xmlWriter.Flush();
                    xmlWriter.Close();
                }
            }
        }
    }
}

答案 1 :(得分:0)

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

两个双打是否相等意味着什么?他们只需要在一个小的三角区内。

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...
}