Как работает ListUtils.subtract ()? - PullRequest
1 голос
/ 31 января 2012

Я пытаюсь вычесть значения одного списка из другого с помощью ListUtils.subtract (1,2), однако я заметил, что вычитание никогда не происходит, поэтому я продолжаю возвращать все элементы в 1. Я подумал, что это может указывать на проблему равенства, но мой хэш-код и метод 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 ]

3 голосов
/ 31 января 2012

Простой ответ (при условии, что вы имеете в виду коллекции Apache Commons): согласно исходному коду ListUtils.subtract(List, List) он использует ArrayList.remove(Object), который, в свою очередь, использует equals() для определения удаляемых элементов.

К твоей проблеме: я думаю, что мне стоит посмотреть на метод equals. Тот, кого вы предоставляете, действительно называется? Верны ли зависимые методы (для производителя и т. Д.)?

1 голос
/ 31 января 2012

getManufacturer () возвращает производителя, и вы не переопределили .equals и .hashCode, поэтому два экземпляра производителя с одинаковыми полями не будут считаться равными.

Это основано на дополнительном контексте IRC, поэтому, пожалуйста, добавьте это к своему вопросу, чтобы он был полезен для других. Общее правило заключается в том, что с тестовым набором вы получите точный ответ раньше.

...