2012-03-23 3 views
1

Моя попытка настроить метод содержит в ArrayList, я использовал Eclipse, для создания этих методов внутри класса TaskCandidateListItemDoРеализация равных и хэш-код для ArrayList.contains() не работает

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result; 

    if (keyValue == null) { 
     result += 0; 
    } else { 
     result += keyValue.hashCode(); 
    } 

    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) { 
     return true; 
    } 
    if (obj == null) { 
     return false; 
    } 
    if (getClass() != obj.getClass()) { 
     return false; 
    } 

    TaskOverrideItemDo other = (TaskOverrideItemDo) obj; 

    if (keyValue == null) { 
     if (other.keyValue != null) { 
      return false; 
     } 
    } else if (!keyValue.equals(other.keyValue)) { 
     return false; 
    } 
    return true; 
} 

И вот как я использую его

taskCandidateList = (List<TaskCandidateListItemDo>) namedQuery.list(); 

for (TaskOverrideItemDo taskOverrideItemDo : validateOverrideListSearchCriteriaDo 
     .getTaskOverrideItemDoList()) { 

    if (taskCandidateList.contains(taskOverrideItemDo.getKeyValue())) { 
     // do some code 
    } 
} 

Мой список объявлен как следует

private List<TaskCandidateListItemDo> taskCandidateList; 

// сделать некоторый код внутри оператора if никогда не выполняется, даже если keyValue существует. Кроме того, точка разрыва Wouldnt остановить на методе Equals ..

ответ

1

Попробуйте с:

if (taskCandidateList.contains(taskOverrideItemDo)) { 

Без getKeyValue(), я полагаю, он возвращает значение поля keyValue (и ваш метод equals сравнивает только TaskCandidateListItemDo из:

if (getClass() != obj.getClass()) { 
    return false; 
} 

качестве альтернативы вы можете поддерживать сравнение с типом keyValue внутри метода equals ,

+0

Спасибо Andriano, попробуем это – sonx

2

Я подозреваю, что это проблема:

if (getClass() != obj.getClass()) { 
    return false; 
} 

Предполагая, что это из гибернации фактических объектов, которые вы получите обратно вполне могут быть каким-то подкласса под управлением байтового кода TaskCandidateListItemDo.

Конечно, вы должны быть в состоянии сказать это с помощью отладчика. Просто поместите брейк-пойнт (или протоколирование) на этом return false ...

+0

Используйте (Хеш) комплект тоже. –

+0

@JoopEggen: Или, возможно, 'LinkedHashSet', в зависимости от того, важен ли заказ. Но давайте сначала рассмотрим часть равенства. Если есть небольшое количество результатов, это не имеет значения. –

+0

просто интересовало, что влияет на передачу TaskOverrideItemDo, в то время как ArrayList - TaskCandidateListItemDo? Я изменил это, передав TaskCandidateListItemDo в этот список массивов, но те же результаты – sonx

Смежные вопросы