Оператор.contains() не работает для ArrayList с объектом

Я использую следующий код:

final UnassignedSubjectData selsub = (UnassignedSubjectData) spinSelectSubject
            .getSelectedItem();
ArrayList<UnassignedSubjectData> selectedSubjectList = null;
    if (selsubdata != null) {
        selectedSubjectList = new ArrayList<UnassignedSubjectData>(
                Arrays.asList(selsubdata));
        Log.d(LOGTAG, "Check " + selsub.toString());
        Log.d(LOGTAG, "Check " + selectedSubjectList.toString());
        Log.d(LOGTAG, "Result for if "
                + Arrays.asList(selsubdata).contains(Arrays.asList(selsub)));
if (selectedSubjectList.contains(Arrays.asList(selsub))) {
            CustomToast.showCustomToast(this,
                    "Subject already present in list");
            Log.d(LOGTAG,
                    "IN IF after TOAST " + selectedSubjectList.toString());
            return;
        }
        else
            Log.d(LOGTAG, "Showing subject not in list");
    }

selsub является объектом UnassignedSubjectData,

Я получаю следующее для одного из условий в LogCat:

Check History
Check [History, Science, Science, History]
Result for if false
Showing subject not in list

Это означает, что даже когда объект присутствует в ArrayList .contains() оператор не работает должным образом. Пожалуйста, помогите мне найти решение для этого.

2 ответа

Решение

Во-первых, как указывает @LuiggiMendoza, вызов

Arrays.asList(selsubdata).contains(Arrays.asList(selsub))

никогда не вернет true здесь, так как вы хотите искать элемент, а не подсписок. Измените это на:

Arrays.asList(selsubdata).contains(selsub)

Во-вторых, List#contains() использует equals() метод списка элементов для сравнения. По умолчанию equals() унаследованный от Object сравнивает ссылки, которые не будут работать, как вы хотите.

За contains() Для правильной работы вашего объекта необходимо реализовать equals() (а также hashCode()) за UnassignedSubjectData,

hashCode() на самом деле не нужно для сравнения, но всегда должно быть реализовано вместе с equals(),

Ovevride equals() а также hashcode() для свойств, на основе которых вы хотите определить равенство. Затем, contains() будет работать для этих свойств.

Другие вопросы по тегам