我有这个班级
public class Point {
private Double[] coordinates;
private int dimension;
public Point(Double[] coordinates) {
dimension = coordinates.length;
this.coordinates = new Double[dimension];
for(int i = 0; i < dimension; i++)
this.coordinates[i] = coordinates[i];
}
public Double getCoord(int n) {
if(n < 0 || n > dimension -1 ){
throw new RuntimeException("error de coordenadas");
}
return coordinates[n];
}
public int getDim() {
return dimension;
}
public boolean equals(Object p1){
if( (p1 instanceof Point) ){
Point p = (Point) p1;
int n = p.getDim();
if(getDim() == n)
{
for(; n > 0; n--)
{
if( Double.valueOf(this.getCoord(n-1)) != Double.valueOf(p.getCoord(n-1)) ) // <------- BAD LINE!
{
System.out.println("Checking coord " + (n-1));
System.out.println("Coord " + (n-1) + " p = " + Double.valueOf(this.getCoord(n-1)));
System.out.println("Coord " + (n-1) + " p2 = " + Double.valueOf(p.getCoord(n-1)));
return false;
}
}
}
return true;
}
return false;
}
}
这个主要的
public class FigureTest {
public static void main(String[] args){
Double[] coord1 = {2.0,3.3};
Double[] coord2 = {2.0,3.3};
Point p = new Point(coord1);
Point q = new Point(coord2);
System.out.println(p.equals(q));
}
}
我无法理解为什么这个p.equals(q)
返回false!它进入if( Double.valueOf(...
但是然后打印出两个坐标相等。如果删除Double.valueOf
,则相同。它工作的唯一方法是我放! if(this.getCoord(n-1).equal(p.getCoord(n-1))
,但我不明白为什么其他人不工作。
答案 0 :(得分:4)
<div id="container">
<div id="buttonContainer">
<span id="button">🕓</span>
<span id="title">History</span>
</div>
</div>
会返回Double.valueOf
对象,不是原始对象。
您执行参考检查(Double
)。因此,即使!=
为两个调用返回相同的数值,不同的对象也将包装数字,因此!=检查将为真,导致您的等于返回false。
这是一个简单的例子:
Double.valueOf(getCoords(n-1))
注意它是如何返回public static void main(String[] args){
System.out.println(Double.valueOf(5) == Double.valueOf(5));
}
的。这是因为false
是参考检查,每次调用==
时都会返回不同的对象。所以当你这样做时
Double.valueOf
该检查将返回true,因为Double.valueOf(...) != Double.valueOf(...)
调用没有返回相同的对象。这就是为什么检查代码会返回valueOf
,导致true
返回equals
。
要解决此问题,您可以......
将您的false
支票更改为!=
支票,该支票会比较数值而不是参考号。
.equals
如果两者共享相同的数值,则返回Double.valueOf(...).equals(Double.valueOf(...));
。
或者您可以在致电true
时使用doubleValue()
:
getCoord
这样可以避免过多地创建getCoord(n-1).doubleValue() != other.getCoord(n-1).doubleValue()
个对象。
答案 1 :(得分:-3)
为了这个工作;:
p.equals(q)
你需要保持Hashcode和equals之间的契约,并在equals
类中hashcode
和Point
覆盖正确这两者,当我写得正确我的意思是这个:
如果你不知道为什么或者你不需要它,请参考这个question
Double.valueOf(this.getCoord(n-1)) != Double.valueOf(p.getCoord(n-1))
如果班级Point
的成员是双打的,那么当您将这些双打作为标准来判断是否p1.equals(p2)
但根据documentation of the class Double,必须使用静态方法Double.compare(this.getCoord(n-1)),p.getCoord(n-1)
才能比较2个双打内容。
因此我建议在equals
方法中使用与此类似的方法
if( Double.compare(this.getCoord(n-1)),p.getCoord(n-1)!=0) )