2015-11-05 60 views
0

我有一个声明了一个哈希映射的类级别。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和单位对象找到此值。 rateUnitCost: - 哈希映射值

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)的时候,即使Object1被设置,其返回null。 Object1正从使用以下行其他类返回: -

return new Object1(); 

谁能帮我解决这个谜?

BasicUnit是一个实现Unit接口的类。 BasicUnit有如下equals方法: -

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:你能否贴上单元类的实现细节?由于Map是基于hashkey处理的。 –

+0

@PrakashBhagat单位只是一个接口 公共接口部件延长可比 { } –

+0

然后请粘贴实现类的细节。 –

回答

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

你检查你的Unit对象是否具有准确相同ArrayList的标志。这不是equals()型的相等性检查;这是检查标志字面上相同的ArrayList。现在,你还没有提供构造函数等,但我非常怀疑你正在重复使用相同的ArrayList

改为检查!(flags.equals(basicUnit.flags))。请注意0​​使用E.equals()实现,因此请确保已实施。

此外,请注意ArrayList.equals()检查相同的列表条目在相同的顺序。我不知道你的旗帜顺序是否重要,但我怀疑它可能没有。如果情况属实,你可以考虑制作一个Set