【问题标题】:Walk through nested dictionary in dart浏览 dart 中的嵌套字典
【发布时间】:2020-06-21 00:14:13
【问题描述】:

在飞镖中我有一个嵌套的元素列表

void main() {
  
  var diction = <String, dynamic>{'1':'Alpha','2':'Beta','3':{'x':'Football','y':'Golf'},'4':{'a':'Samba','b':'Tango','c':'FoxTrott','d':'Waltz'}};
}

以及引导您浏览字典的键列表,例如

var keyList = ['4','a']

问题是,我不能只使用

diction['4','a']

但必须使用

diction['4']['a']

我怎样才能像最后一种情况那样调用字典?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    operator [] 只接受一个参数。那是语言的语法,你不能改变它。

    可能的行动:

    • 什么都不做。只需使用dict[key1][key2] 并接受它。我不清楚像 dict[key1, key2] 这样的东西会不会有任何真正的改进。

    • 直接构造一个LinkedHashMap,它使用List作为它的key。您需要提供equalshashCode 回调,因为List 相等通常基于对象标识并且不执行深度相等检查。 (同样,通常每个List 实例都会有一个不同的hashCode。)完成后,您可以使用dict[[key1, key2]]。请注意,使用这种方法,您可能会拥有可变数量的键。

    • 使用package:tuple 并使用Tuple2 作为密钥。然后你可以使用dict[Tuple2(key1, key2)]。由于元组是“值”类型并实现了operator ==hashCode,因此您可以直接使用Tuple2 而无需做额外的工作。

    • 派生您自己的基于Map 的类。您可能希望从 package:collection's DelegatingMap 类派生,它将为您提供大部分实现。从那里您可以添加自己的方法,这些方法采用多个键并在内部执行嵌套查找。如果添加call(Key1 key1, Key2 key2) method,自定义Map 的实例将成为类似函数的对象,然后调用者可以使用dict(key1, key2) 执行查找。请注意,您将无法使用相同的语法在自定义 Map 中设置项目。或者不使用call(),您可以添加get(Key1 key1, Key2 key2)set(Key1 key1, Key2 key2, Value value) 方法。

    【讨论】:

      【解决方案2】:

      你可以创建一个做你想做的对象,只需扩展 LinkedHashMap:

      class MyHashMap extends LinkedHashMap
      

      那么你必须实现抽象类的21个方法,你就可以开始了!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-29
        • 2018-05-31
        • 2021-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-05
        • 2021-08-19
        相关资源
        最近更新 更多