我正在编写图像处理程序,我对列表有疑问。
我有一个包含点数的列表。
class Point1{
private int x;
private int y;
Point1(int x,int y)
{
this.x = x;
this.y = y;
}
int getX(){ return this.x; }
int getY() {return this.y; }
}
ArrayList<Point1> list = new ArrayList();
现在,我创建了新的Point,例如new Point(4,3); 我想检查列表中是否有一个具有相同坐标的点。问题是
list.contains(Object a)
正在检查我的列表中是否有特定对象。如果我放
它会起作用 Point1 first = new Point(1,1);
list.add(first);
list.contains(first) // and this is true
但:
Point second = new Point(2,2);
list.add(second);
list.contains(new Point(2,2)); <- false
我该怎么检查呢?
答案 0 :(得分:3)
您需要覆盖equals
课程上的Point
。您的Point
类必须负责确定另一个Point
对象是否与当前对象“相等”。 ArrayList
将调用equals
来确定传入contains
的对象是否与列表中的任何项“相等”。
如果您没有覆盖equals
,那么Point
将继承equals
from Object
,这将只是查看它是否是完全相同的对象。这就是为什么你的第一个代码“有效”,因为你正在重用first
。它还解释了为什么你的第二个代码没有“工作”,因为你使用了另一个对象。
此外,如果您覆盖equals
,最好也覆盖hashCode
(反之亦然)。
答案 1 :(得分:1)
列表通过从equals()
扩展的默认Object
方法确定两个对象是否相等。默认的equals()
方法只是确定两个对象是否具有相同的域值(我认为它是内存地址)。它可以由toString()
打印。因此,您是否只想通过此对象中的值确定“等于”,您需要覆盖equals()
。你可以编码如下:
@Override
public boolean equals(Object other) {
if(this == other)
return true;
if(other == null)
return false;
if(getClass() != other.getClass())
return false;
Point1 test = (Point1)other;
if(this.x == test.getX() && this.y == test.getY())
return true;
return false;
}
你可以得到你想要的结果: