in dart我有一个嵌套的元素列表
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']
我如何使用像最后一种情况一样调用字典?
>operator []
只接受一个参数。 这是语言的语法,你不能改变它。
可能的操作:
-
什么都不做。 只需使用
dict[key1][key2]
并与之共存。 我不清楚像dict[key1, key2]
这样的事情会有什么真正的改进。 -
直接构造一个使用
List
作为其键的LinkedHashMap
。 您需要提供equals
和hashCode
回调,因为List
相等通常基于对象标识,并且不执行深度相等性检查。(同样,通常每个List
实例都有一个不同的hashCode
。完成所有这些操作后,您可以使用dict[[key1, key2]]
. 请注意,使用此方法,可以想象可以拥有可变数量的键。 -
使用
package:tuple
并使用密钥的Tuple2
。 然后你可以使用dict[Tuple2(key1, key2)]
. 由于元组是"值"类型并实现operator ==
和hashCode
,你可以直接使用Tuple2
,而无需做额外的工作。 -
派生您自己的基于
Map
的类。 您可能希望从package:collection
的DelegatingMap
类派生,该类将为您提供大部分实现。 从那里,您可以添加自己的方法,这些方法采用多个键并在内部执行嵌套查找。 如果添加call(Key1 key1, Key2 key2)
方法,则自定义Map
的实例将成为类似于函数的对象,然后调用方可以使用dict(key1, key2)
来执行查找。 请注意,您将无法使用相同的语法在自定义Map
中设置项目。 或者,您可以添加get(Key1 key1, Key2 key2)
和set(Key1 key1, Key2 key2, Value value)
方法,而不是使用call()
。
你可以创建一个对象来做你做什么,只需扩展LinkedHashMap:
class MyHashMap extends LinkedHashMap
然后你必须实现抽象类的 21 个方法,你就可以开始了!