ListUtils.subtract()如何工作?

时间:2012-01-31 01:04:55

标签: java apache-commons

我试图用ListUtils.subtract(1,2)从另一个列表中减去一个列表的值但是我注意到减法永远不会发生所以我继续得到1中返回的所有元素。我认为这可能是一个平等问题的指示,但我的hashcode和equals方法很好。(我认为)

   @Override
    public boolean equals(Object o) {
        if(!(o instanceof Car))
            return false;

        Car ct = (Car) o;

        return this.getManufacturer().equals(ct.getManufacturer())
                && this.getImmat().equals(ct.getImmat())
                && this.getModel().equals(ct.getModel());
    }

@Override
public int hashCode() {
    int hash = 5;
    hash = 71 * hash + (this.model != null ? this.model.hashCode() : 0);
    hash = 71 * hash + (this.immat != null ? this.immat.hashCode() : 0);
    hash = 71 * hash + (this.manufacturer != null ? this.manufacturer.hashCode() : 0);
    return hash;
}

执行减法的代码:

            List <Car> affected = new LinkedList<Car>();

            for(Driver c : tmp)
                affected.add(c.getCar());

           List <Car> allcars = carDAO.findAllCars("order by model");//returns every car

            List<Car> cars = ListUtils.subtract(allcars, affected );


    return cars;

我已经检查了两个列表并且它们很好,但是我无法让ListUtils减去allcars的影响(返回allcars集)导致我因为某些原因认为equals方法可能是错误的。

2 个答案:

答案 0 :(得分:3)

简单回答(假设您的意思是Apache Commons Collections):根据ListUtils.subtract(List, List)的源代码,它使用ArrayList.remove(Object),后者又使用equals()来确定要删除的项目。

对你的问题:我的猜测是调查equals方法。你提供的那个真的叫吗?依赖方法(对于制造商等)是否正确?

答案 1 :(得分:1)

getManufacturer()返回一个制造商,并且您没有覆盖.equals和.hashCode,因此具有相同字段的两个制造商实例将不会被视为相等。

这是基于IRC的额外背景,所以请将其添加到您的问题中,以便它对其他人有用。一般规则是,对于测试用例,您可以更快地得到准确的答案。