2015-11-05 3 views
0

У меня есть уровни классов, которые объявлены hashMap.HashMap возвращает NULL

public class Levels{ 
    private final Map<Unit, Object1> rateUnitCost; 

    public Levels(Map<Unit, Object1> levels) { 
    this.rateUnitCost = new HashMap<Unit, Object1>(levels); 
} 

    public Object1 getCoverageLevel(Unit unit, Phase aP) { 

     return rateUnitCost.get(unit); 
     } 
} 

Я зову getCoverageLevel() метод из другого класса, и я инстанцирование rateUnitCost собственности Уровни класса, а из другого класса.

Когда вы видите в отладчике, я нахожу это значение для объекта rateUnitCost и объекта unit. rateUnitCost: - Hash Карта Значения

rateUnitCost HashMap<K,V> (id=1248) 
    [0] HashMap$Node<K,V> (id=1266)  
    key >Unit (id=1249) 
     amount Money (id=1267)  
     flags ArrayList<E> (id=1268) 
     procedureId 7156  
     ParticipationId 104152413 
    value >Object1 (id=1250) 

Теперь значение единичного объекта ниже: -

unit Unit (id=1251) 
amount Money (id=1258)  
flags ArrayList<E> (id=1259) 
procedureId 7156  
ParticipationId 104152413 

когда я совпадает со значением ключа с этим объектом, то его согласование. Но во время rateUnitCost.get (unit) возвращается значение null, даже если установлен Object1. Объект1 возвращается из другого класса, используя следующую строку: -

return new Object1(); 

Может ли кто-нибудь помочь мне разрешить эту тайну.

BasicUnit - это класс, который реализует интерфейс Unit. BasicUnit есть равно метод, как показано ниже: -

public boolean equals(Object o) { 
    if (this == o) return true; 
    if (o == null || getClass() != o.getClass()) return false; 

    BasicUnit basicUnit = (BasicUnit) o; 

    if (flags != basicUnit.flags) return false; 
    if (procedureId != basicUnit.procedureId) return false; 
    if (ParticipationId != basicUnit.ParticipationId) return false; 
    if (amount != null ? !amount.equals(basicUnit.amount) : basicUnit.amount != null) return false; 

    return true; 

}

и HashCode: -

public int hashCode() { 
    int result = procedureId; 
    result = 31 * result + ParticipationId; 
    result = 31 * result + (amount != null ? amount.hashCode() : 0); 
    result = 31 * result + (flags == null ? null : flags.hashCode()); 
    return result; 

}

+0

@Manish: Не могли бы вы вставить детали реализации класса Unit? Поскольку Map обрабатывается на основе hashkey. –

+0

@PrakashBhagat Unit только интерфейс общедоступный интерфейс Блок расширяет Comparable { } –

+0

Тогда PLS паста класса реализации деталей. –

ответ

2
if (flags != basicUnit.flags) return false; 

Вы проверка, есть ли у ваших Unit объектов точно те же ArrayList из флагов. Это не проверка равенства equals(); это проверяет буквально тот же флаг ArrayList. Теперь вы не указали конструктор и т. Д., Но я очень сомневаюсь, что вы повторно используете то же самое ArrayList.

Проверьте вместо !(flags.equals(basicUnit.flags)). Обратите внимание, что ArrayList.equals() использует реализацию E.equals(), поэтому убедитесь, что это реализовано.

Также обратите внимание, что ArrayList.equals() проверяет одинаковые записи в списке в том же порядке. Я не знаю, имеет ли порядок ваших флагов, но я подозреваю, что, вероятно, нет. Вы можете подумать о том, чтобы сделать свою коллекцию флагов Set, если это так.

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