我必须编写一个代码,通过扩展Geometric对象的类创建一个三角形。那么我们必须编写一个equals方法来比较三角形。我不确定如何调用另一个三角形进行比较。
[[ $s =~ \(()\)* ]]&&echo true||echo false
答案 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...
}