检查列表是否包含对象 - java

时间:2014-05-29 00:35:34

标签: java

我正在编写图像处理程序,我对列表有疑问。

我有一个包含点数的列表。

     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

我该怎么检查呢?

2 个答案:

答案 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; }

你可以得到你想要的结果:
enter image description here