2014-02-17 41 views
3

我嘗試使用TreeMapcontainsKey方法,但不知何故,我遇到了問題。treemap使用compareTo而不是equals for containsKey()

定義存儲在樹形圖中的對象,例如equals()不能提供與compareTo()相同的結果。這是有意的。

然而,java.util.Map的醫生說:

返回true,如果此映射包含指定鍵的映射。更正式地說,當且僅當該映射包含關鍵字k的映射(如(key==null ? k==null : key.equals(k)))時才返回true。 (可以有至多一個這樣的映射。)

所以,我試圖以下:

c = someModifiedObject(); 
boolean t1 = sm.containsKey(c); 
someObject c2 = new someObject(); 
boolean t2 = sm.containsKey(c2); 
boolean t3 = c.equals(new Chain()); 
int t4 = c.compareTo(new Chain()); 

t1爲真,當對象是在樹形圖。 t3爲真,因爲t1等於t3(關於變化equals()運營商) t4爲假 但是,t2也是錯誤的。看起來TreeMap使用compareTo()而不是equals()來確定對象是否存在。

是否有排序映射的另一個實現,其中我可以使用equals()來檢查對象是否存在?

+2

使用使比較符合等於或更好的比較器,修復compareTo方法,使其與equals相等。與比較不一致的比較方法應該作爲比較器來實現,而不是該類的固有自然順序。 –

+0

但該文檔還指出:_「Collections Framework接口中的許多方法都是用equals方法定義的,例如,containsKey(Object key)方法的規範說:」[太長,以至於不適合評論,但它是你給出的def]「這個規範不應該被解釋爲暗示用非空參數鍵調用Map.containsKey會導致key.equals(k)被調用用於任何鍵k。實現可以自由地實現優化,例如,通過首先比較兩個鍵的哈希碼,就可以避免相等的調用。「_ –

+0

爲什麼在&神的綠色地球上,你會希望'compareTo'和'equals'等價地沒有響應? (並且要記住,任何有序集合都會使用相對比較來確定集合中實體的相對位置,所以'compareTo'是自然使用的,你需要使用'equals'的無序集合來「邏輯」 。) –

回答

0

儘管沒有標準的java API來準確地獲得你想要的,你可以創建你自己的比較器接口,然後讓你的TreeMap實現這個Comparator。無論如何,您可以覆蓋compareTo()方法以表現行爲(在您的情況下,使其行爲與equals()方法的行爲相同)。

相關問題