【问题标题】:How to convert/cast HashMap to LinkedHashMap?如何将 HashMap 转换/转换为 LinkedHashMap?
【发布时间】:2016-08-15 14:28:04
【问题描述】:

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

我正在尝试在其中存储LinkedHashMap,但由于某种原因,当我将其从 Hawk 拉回时,它会以常规 HashMap 而不是LinkedHashMap 的形式返回。在这一点上,我因ClassCastException 而崩溃,因为HashMap 无法直接转换为LinkedHashMap

所以问题是如何将返回的HashMap 转换为LinkedHashMap

【问题讨论】:

  • 感谢您的挑战。我喜欢一个需要深入挖掘的重要问题。
  • @DavidWasser,感谢您的详细回答,由于某种原因,并非所有人都认为这是一个不错的问题。
  • 我不知道反对票的来源。这实际上让我感到惊讶。
  • @DavidWasser,我猜有些人不明白这个社区的真正目的。没关系...再次感谢您的帮助。

标签: java android casting hashmap linkedhashmap


【解决方案1】:

所有建议您可以从HashMap 创建LinkedHashMap 的答案在技术上都是正确的,但不会给您想要的结果:-(

当然,您可以从HashMap 创建一个LinkedHashMap,但不能保证LinkedHashMap 的顺序与您原来的顺序相同。

问题在于,当您的LinkedHashMap 作为普通无序Map 存储到持久存储中时,它会被序列化,这不会保留单个项目的顺序。然后,当您从持久存储中提取对象时,它会以纯 HashMap 的形式返回,并且它已经失去了“排序”(这是您首先想要的 LinkedHashMap)。如果您随后从返回的 HashMap 创建一个 LinkedHashMap,则顺序很可能与原始顺序不同。

为了正确执行此操作,您可能应该将您的LinkedHashMap 转换为对象的有序数组,并将此有序数组存储在持久存储中。然后,您可以从持久存储中读取有序的对象数组,并以正确的顺序重新创建 LinkedHashMap。基本上,你需要自己序列化和反序列化LinkedHashMap

更多详情请见my answer to this question

【讨论】:

【解决方案2】:

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

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

Object 将是您需要的类型。

【讨论】:

    【解决方案3】:

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

    代码示例:

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

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

    【讨论】:

    • @DavidWasser 我按照要求做了。你做了需要做的事。 ?
    猜你喜欢
    • 2011-04-16
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2020-06-11
    • 1970-01-01
    相关资源
    最近更新 更多