我在我的应用程序中使用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,谢谢您的详细解答,出于某种原因,并非所有人都认为这是一个体面的问题。 –
我不知道降薪来自哪里。这实际上让我很吃惊。 –