.contains()运算符不适用于带对象的ArrayList

时间:2013-05-31 05:45:34

标签: java 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");
    }

selsubUnassignedSubjectData的对象。

我在LogCat中的一个条件中得到以下内容:

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

这意味着即使ArrayList中的对象存在,.contains()运算符也无法正常工作。 请帮我找到解决方案。

2 个答案:

答案 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()将适用于这些属性。