Collection.contains дает неверный результат - PullRequest
0 голосов
/ 10 мая 2018

У меня есть объект, у которого есть пара полей - как вы можете видеть, метод hashcode и equals реализован только с учетом идентификатора:

public class SpotResponse{
String id;
// bla bla other fields
public SpotResponse() {
}

public SpotResponse(@NonNull String id) {
    this.id = id;
}
public String getId() {
    return id;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    SpotResponse that = (SpotResponse) o;

    return id == that.id;
}

@Override
public int hashCode() {
    return id.hashCode();
}
}

У меня есть метод, который проверяет, если Collection<SpotResponse> newSpots

содержит oldSpot с HashMap<String, SpotResponse> spots = new HashMap<>();

Если я сделаю это:

List<String> newKeys = new ArrayList<>();

    for (SpotResponse response : newSpots) {
        newKeys.add(response.getId());
    }

    for (SpotResponse oldSpot : spots.values()) {
        if (newKeys.contains(oldSpot.getId())) {
            continue;
        }
        /* blabla */
    }

newKeys.contains () возвращает true правильно, но если вместо этого я делаю

newSpots.contains(oldSpot)

Он всегда возвращает ложь. В этом случае коллекция представляет собой ArrayList (если это поможет)

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Ваша ошибка в вашей equals реализации, в этой строке:

return id == that.id;

Вы сравниваете два String с (а именно id и that.id) с ==, когда вам следует использовать id.equals(that.id).

0 голосов
/ 10 мая 2018

Вы должны быть осторожны при использовании Contains с примитивами.Технически, String - это объектный класс, заключающий в себе примитив символов, но когда вы сравниваете его, он не сравнивает буквальный указатель памяти объекта, а сравнивает значение в указателе памяти.

Содержит использует .equalsпоэтому при переопределении equals в вашем классе вы не можете по умолчанию вернуться к сравнению ==, поскольку при этом сравниваются адрес и необязательно значение.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...