2016-08-15 38 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我做了什么问。你做了需要的。 –