我使用以下代码:
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()
运算符也无法正常工作。
请帮我找到解决方案。
答案 0 :(得分:3)
首先,正如@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()
一起实施。
答案 1 :(得分:1)
为您要定义相等性的属性提供equals()
和hashcode()
。然后,contains()
将适用于这些属性。