ArrayList.contains() не работает

88
7

У меня есть этот массив сообщений, и я хочу обновить его новыми сообщениями, которые я получаю от вызова API. Я повторяю через массив, который я получаю, а затем проверяю, уже ли сообщения уже находятся в ArrayList или нет. Если нет, добавьте его в список.

Но по какой-то неизвестной причине он не работает. Он дублирует все элементы в списке, но новый элемент никогда не существует. Я не могу понять, что случилось с моей реализацией equals() или hashCode().

    @Override
public boolean equals(Object object) {
boolean result = false;
if (object == null || object.getClass() != getClass()) {
result = false;
} else {
Message mess = (Message) object;
if (this.id == mess.getId() && this.extid == mess.getExtid()) {
result = true;
}
}

return result;
}

@Override
public int hashCode() {
int hash = 3;
hash = 7 * hash + this.id.hashCode();
hash = 7 * hash + this.extid.hashCode();
return hash;
}

populateData():

    private void populateData(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
JSONArray ArrayMessages = jsonObject.getJSONArray("messages");

Gson gson = new Gson();

Message[] messages = gson.fromJson(ArrayMessages.toString(), Message[].class);

for (Message message : messages) {
if(!messageList.contains(message)) {
messageList.add(message);
}
}

adapter.notifyDataSetChanged();
} catch (JSONException e) {
e.printStackTrace();
}

спросил(а) 2021-01-25T14:57:28+03:00 5 месяцев назад
1
Решение
63

Какой тип id и extId? Вы должны сравнивать их с equals() вместо == и использование set позволит избежать проверки того, находится ли элемент уже в коллекции, потому что наборы не позволяют дублировать.

ответил(а) 2021-01-25T14:57:28+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема