2012-03-19 49 views
0

我正在使用鍵值爲Object []的TreeMap(SortedMap),其元素類型各不相同。如果不使用像containsKey()和get()這樣的方法,除非我解決它,否則TreeMap的equals()在Object []上不起作用,就像數組的equals()會做的那樣。Map的等於()爲數組鍵

有沒有解決方案,這不涉及創建一個全新的類?

編輯:

只是要清楚,我犯了一個錯誤的假設。創建一個new Comparator(){}也會影響每個使用相等的方法,例如equals(),而不僅僅是樹分類器。

+0

另請參見http://stackoverflow.com/questions/8777257/equals-vs-arrays-equals-in-java – Raedwald 2014-08-11 06:35:32

+0

可能的重複[對於equals和compareTo是否有意義是不一致的?](http:/ /stackoverflow.com/questions/7949​​61/does-it-make-sense-for-equals-and-compareto-to-be-inconsistent) – Raedwald 2014-08-11 06:38:02

回答

7

是否有解決方案,這不涉及創建一個全新的類?

不,實際上,你根本不應該使用可變的map值。

+1

@Trevor問題是一個數組可以在將它插入樹中後進行更改。那時,它可能會在樹中錯誤的地方。因此,使用數組作爲鍵是不安全的。 – 101100 2012-03-19 13:50:54

2

雖然我同意Matt Ball你一般不應該使用可變(可變)類型作爲你的密鑰,但只要你不打算修改數組,一旦它們進入就可以用這種方式使用TreeMap那個樹。

此解決方案確實涉及創建一個類,但不涉及新的Map類,這正是您所要求的。相反,你需要創建自己的類,它可以比較數組。該類可以使用Arrays.equals()方法來確定它們是否相等,但是需要也有一致的規則來確定當數組不相等時哪個數組位於另一個數組之前。

+1

你不需要用'TreeMap'重寫'equals'或'hashCode'。從[TreeMap的文檔](http://docs.oracle.com/javase/6/docs/api/java/util/TreeMap.html):「一張圖使用其compareTo(或compare)方法執行所有關鍵比較,所以從排序圖的角度來看,這種方法認爲相同的兩個鍵是相等的。「 所有你需要實現的就是你提到的「比較器」,並且樹圖將起作用。 (同樣,假設你在插入數組後再也不更改數組。) – 101100 2012-03-19 15:22:10