如何将HashMap转换/转型为LinkedHashMap?

9

我正在使用Hawk替换我的应用程序中的SharedPreferences

我尝试将一个LinkedHashMap存储在其中,但是当我从Hawk中获取它时,它会返回一个普通的HashMap而不是LinkedHashMap。此时我会遇到一个ClassCastException异常,因为HashMap不能直接转换为LinkedHashMap

那么问题来了,如何将返回的HashMap转换为LinkedHashMap呢?


1
谢谢你的挑战。我喜欢那些需要一些探索的非平凡问题。 - David Wasser
@DavidWasser,感谢您详细的回答,不知为何并非所有人都认为这是一个合理的问题。 - Emil Adz
1
我不知道这些踩的来源。实际上,这让我很惊讶。 - David Wasser
@DavidWasser,嗯,我猜有些人可能不理解这个社区的真正目的。算了吧……再次感谢你的帮助。 - Emil Adz
3个回答

16
所有建议您可以从HashMap创建LinkedHashMap的回答都是技术上正确的,但不会给您想要的结果 :-(
当然,您可以从HashMap创建LinkedHashMap,但不能保证LinkedHashMap具有与原始HashMap相同的顺序。
问题在于当您将LinkedHashMap存储到持久存储中时,它会作为一个无序的Map序列化,这不会保留各个项的顺序。然后,当您从持久存储中提取对象时,它以普通的HashMap返回,并且已经丢失了“顺序”(这是您最初需要一个LinkedHashMap的原因)。如果您接下来从返回的HashMap创建LinkedHashMap,则排序很可能与原始的不同。
为了正确地执行此操作,您应该将LinkedHashMap转换为有序对象数组并将此有序数组存储在持久存储中。然后,您可以从持久存储中读取有序对象数组,并使用正确的顺序重新创建LinkedHashMap。基本上,您需要自己对LinkedHashMap进行序列化和反序列化。
有关更多详细信息,请参见我对此问题的答案

1
为了实现这一点,我建议使用以下代码示例:http://stackoverflow.com/a/43142613/1855855 - Adi B

11

只需创建一个新的LinkedHashMap,因为它可以将任何Map作为构造函数参数。

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

Object 是你需要的类型。


2

LinkedHashMap的其中一个构造函数接受一个Map。它将返回一个与HashMap内容相同的LinkedHashMap

代码示例:

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

其中T是存储在HashMap中的对象的类型


4
@DavidWasser 我做了被要求的事情。你做了必要的事情。 - Pankaj Singhal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接