1

我正在使用以下代码:

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()员中,也无法正常工作。请帮我找到解决方案。

4

2 回答 2

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().

于 2013-05-31T05:49:07.060 回答
1

覆盖equals()hashcode()用于要在其基础上定义相等性的属性。然后,contains()将适用于这些属性。

于 2013-05-31T05:51:02.100 回答