2016-08-15 64 views
2

我在我的應用程序中使用Hawk作爲SharedPreferences的替代品。如何將HashMap轉換爲LinkedHashMap?

我想一個LinkedHashMap存儲,但是,當我拉回來,從某種原因,它返回作爲常規HashMap而不是LinkedHashMap。在這一點上,我碰到一個ClassCastException作爲HashMap不能鑄造LinkedHashMap直截了當。

所以問題是如何將返回的HashMap轉換爲LinkedHashMap

+1

感謝您的挑戰。我喜歡一個不平凡的問題,需要一點挖掘。 –

+0

@DavidWasser,謝謝您的詳細解答,出於某種原因,並非所有人都認爲這是一個體面的問題。 –

+1

我不知道降薪來自哪裏。這實際上讓我很吃驚。 –

回答

8

一切答案建議你可以創建一個HashMap一個LinkedHashMap在技術上是正確的對象的類型,但不會給你想要的結果:-(

當然,你可以從HashMap創建LinkedHashMap,但它不是gua保證LinkedHashMap將具有與原來相同的順序。

問題在於,當您的LinkedHashMap作爲普通無序Map存儲到持久性存儲中時,它會被序列化,這不會持續單個項目的排序。然後,當您從持久性存儲中提取對象時,它將作爲普通的HashMap返回,並且它已經丟失了「排序」(這是您首先想要的LinkedHashMap)。如果您然後從返回的HashMap創建LinkedHashMap,則排序很可能與原始不同。

爲了正確執行此操作,您應該將LinkedHashMap轉換爲對象的有序數組,並將此有序數組存儲在永久存儲器中。然後,您可以從持久性存儲中讀取對象的有序數組,然後以正確的順序重新創建LinkedHashMap。基本上,你需要自己序列化和反序列化LinkedHashMap

有關更多詳細信息,請參見my answer to this question

+0

並且爲了實現這一點,我建議這個代碼示例:http://stackoverflow.com/a/43142613/1855855 –

1

只需創建一個新的LinkedHashMap,因爲它可以將任何Map作爲構造函數參數。

LinkedHashMap<Object> newMap = new LinkedHashMap<>(theHashMapReturnedFromHawk); 

Object將是您需要的類型。

0

其中LinkedHashMap的構造函數接受Map。它會返回LinkedHashMap,其內容與HashMap相同。

代碼示例:

LinkedHashMap<T> newMap = new LinkedHashMap<T>(hashmap); 

其中T是存儲在HashMap

+1

@DavidWasser我做了什麼問。你做了需要的。 –