颤振LinkedHashMap与python中的orderedDict比较

Posted

技术标签:

【中文标题】颤振LinkedHashMap与python中的orderedDict比较【英文标题】:flutter LinkedHashMap compared with orderedDict in python 【发布时间】:2021-07-19 12:23:20 【问题描述】:

从去年秋天开始,我就是飘飘的宝贝。当我们使用颤振类型时,它们通常提供像 toString() 这样的通用特性。其中之一是 '.runtimeType' 但是这种 'getting runtimeType' 方法似乎在发布模式下不起作用,实际上在调试模式下运行良好。

假设我们有像Map amIMap = "key": "is key", "value": "is value",;这样的法线贴图 通常我们认为这个变量的类型是'Map',但是print(amIMap.runtimeType);在调试模式下的方法(这似乎不像在发布模式下工作)打印不是'Map'而是像LinkedHashMap这样的东西,它可能在开发环境的方式略有不同,但LinkedHashMap 的概念基本相同。

那么问题来了。在这个链接'https://api.flutter.dev/flutter/dart-collection/LinkedHashMap-class.html'中,似乎上述情况下的打印类型是 Dart 团队真正想要的,它看起来真的很像 python 中的orderedDict。通过这个问题,我想确保LinkedHashMap 这个概念可以安全使用。我要说的是,我想知道是否像 python 中的“orderedDict”一样安全地保持与键及其对应值的顺序相同,无论在调试、配置文件、发布模式、dartpad 甚至平台等环境中比如androidios、macos、linux、window、web!

由于我已经看到 runtimeType 在我的应用程序中的发布模式下无法正常工作,我担心在发布模式下的 sdk 可能会忘记键值对的顺序,就像 runtimeType 方法一样。

我问这个问题的原因是我需要强制对的顺序与我在 IDEA 中的 dart 代码完全相同,以便我可以将它们转换为相同格式的 json 字符串,然后对 json 进行哈希处理字符串,它们都具有完全相同的对顺序,使用 crypto 包的 sha256 散列方法。在散列之前,地图的顺序必须保持不变。让我害怕的是,颤振往往会因环境而异。另外,当我使用firestore插件时,我必须手动从firestore中对地图进行排序,因为它们的顺序与可以通过firebase控制台检查的顺序不同。这些问题似乎处于相似的背景中。所以我需要布尔值,如果linkedHashMap即使在发布模式下也要保存我的地图对的顺序,而不管flutter 2.0的各种平台,就像python中的orderedDict一样。

希望该领域的任何专家都以完全确信的经验回答这个问题。如果我在这个问题中留下不清楚甚至错误的地方,我会非常感谢您的 cmets,

提前谢谢你[:

【问题讨论】:

【参考方案1】:

首先,您不应该将.runtimeType 用于除调试以外的任何事情。如您所见,输出确实不是那么稳定,因此很少用于任何事情。如果您需要检查给定对象是否与给定class 兼容,则应改为使用is 运算符。

其次,Dart 中的 Map() 构造函数( 语法相同)被记录为创建 LinkedHashMap 的实例。由于这是标准 SDK 和语言设计的一部分,因此这不会改变。此外,此行为将在所有运行 Dart 的平台上保持稳定。

但如果您想确保始终使用LinkedHashMap,您可以通过从dart:collection 导入类来显式创建LinkedHashMap 的实例。

LinkedHashMap 记录为:

记住键的插入顺序,并按照它们插入映射的顺序对键进行迭代。值按其对应键的顺序迭代。更改键的值,当键已经在映射中时,不会更改迭代顺序,但删除键并再次添加将使其成为迭代顺序中的最后一个。

【讨论】:

这个答案很酷!好吧,最好的解决方案应该是在现实世界中做这些事情。谢谢你的回答[:

以上是关于颤振LinkedHashMap与python中的orderedDict比较的主要内容,如果未能解决你的问题,请参考以下文章

c++中map和unorderedmap与java中hashmap和linkedhashmap

图解LinkedHashMap原理

LinkedHashMap 源码解读

在颤振飞镖中的 List<Map> 内搜索?

LinkedHashMap源码阅读笔记(基于jdk1.8)

颤振列表视图字母索引