Оператор.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()
будет работать для этих свойств.