我在我的應用程序中使用Hawk作爲SharedPreferences
的替代品。如何將HashMap轉換爲LinkedHashMap?
我想一個LinkedHashMap
存儲,但是,當我拉回來,從鷹某種原因,它返回作爲常規HashMap
而不是LinkedHashMap
。在這一點上,我碰到一個ClassCastException
作爲HashMap
不能鑄造LinkedHashMap
直截了當。
所以問題是如何將返回的HashMap
轉換爲LinkedHashMap
?
我在我的應用程序中使用Hawk作爲SharedPreferences
的替代品。如何將HashMap轉換爲LinkedHashMap?
我想一個LinkedHashMap
存儲,但是,當我拉回來,從鷹某種原因,它返回作爲常規HashMap
而不是LinkedHashMap
。在這一點上,我碰到一個ClassCastException
作爲HashMap
不能鑄造LinkedHashMap
直截了當。
所以問題是如何將返回的HashMap
轉換爲LinkedHashMap
?
一切答案建議你可以創建一個HashMap
一個LinkedHashMap
在技術上是正確的對象的類型,但不會給你想要的結果:-(
當然,你可以從HashMap
創建LinkedHashMap
,但它不是gua保證LinkedHashMap
將具有與原來相同的順序。
問題在於,當您的LinkedHashMap
作爲普通無序Map
存儲到持久性存儲中時,它會被序列化,這不會持續單個項目的排序。然後,當您從持久性存儲中提取對象時,它將作爲普通的HashMap
返回,並且它已經丟失了「排序」(這是您首先想要的LinkedHashMap
)。如果您然後從返回的HashMap
創建LinkedHashMap
,則排序很可能與原始不同。
爲了正確執行此操作,您應該將LinkedHashMap
轉換爲對象的有序數組,並將此有序數組存儲在永久存儲器中。然後,您可以從持久性存儲中讀取對象的有序數組,然後以正確的順序重新創建LinkedHashMap
。基本上,你需要自己序列化和反序列化LinkedHashMap
。
有關更多詳細信息,請參見my answer to this question。
並且爲了實現這一點,我建議這個代碼示例:http://stackoverflow.com/a/43142613/1855855 –
只需創建一個新的LinkedHashMap,因爲它可以將任何Map作爲構造函數參數。
LinkedHashMap<Object> newMap = new LinkedHashMap<>(theHashMapReturnedFromHawk);
Object
將是您需要的類型。
其中LinkedHashMap的構造函數接受Map
。它會返回LinkedHashMap
,其內容與HashMap
相同。
代碼示例:
LinkedHashMap<T> newMap = new LinkedHashMap<T>(hashmap);
其中T
是存儲在HashMap
@DavidWasser我做了什麼問。你做了需要的。 –
感謝您的挑戰。我喜歡一個不平凡的問題,需要一點挖掘。 –
@DavidWasser,謝謝您的詳細解答,出於某種原因,並非所有人都認爲這是一個體面的問題。 –
我不知道降薪來自哪裏。這實際上讓我很吃驚。 –