是否有任何类型的集合来声明具有链接到相同值的多个键的映射?
我希望在声明 map 的同时对其进行初始化。理想情况是:
MyMap<String, String> mymap = {['red', 'blue', 'green'] : 'Rock', ['pink', 'yellow' ...etc}
到目前为止,我在文档中找到了Multimap,但是它似乎是多重值的一个关键,而且最重要的是,尽管文档给出了0个示例,但实现起来还是很麻烦。到目前为止,这里是我的尝试:
static Iterable mylist = ['red', 'blue', 'green']; // I want to associate these strings to 'Rock'
static Iterable mylist = ['pink', 'yellow', 'cyan']; // I want to associate these strings to 'Funk'
static Multimap<String,String> okayboomer = Multimap.fromIterable(mylist);//, {K key(dynamic element), V value(dynamic element)});
然后,每当我访问okayboomer ['red']时,我都会得到'Rock'。我也在考虑HashMap
任何帮助深表感谢!
最佳答案
您不一定需要任何特殊的数据结构。普通的Map
可以为相同的值包含多个键,而您只需要一个辅助函数即可使其初始化更加方便:
Map<String, String> makeMyMap(Map<List<String>, String> map) {
var newMap = <String, String>{};
for (var entry in map.entries) {
var keyList = entry.key;
for (var key in keyList) {
newMap[key] = entry.value;
}
}
return newMap;
}
然后您应该能够:var mymap = makeMyMap({
['red', 'blue', 'green'] : 'Rock',
['pink', 'yellow', 'cyan']: 'Funk',
});
请注意,上面的Map
将适用于查找,并且如果您在 map 中对值进行了突变,则相关的键仍将引用同一对象。但是,如果需要替换映射中的值,则相关的键将继续引用旧对象。如果需要这样做,则需要在值周围添加一个间接级别。例如:class Wrapped<T> {
Wrapped(this.value);
T value;
}
var map = <String, Wrapped<String>>{};
map['red'] = map['blue'] = map['green'] = Wrapped('Rock');
map['red'].value = 'Funk';
print(map['blue'].value); // Prints: Funk
您可以从 DelegatingMap
派生一个类,以在使用operator []
时自动解开值,并自动为Wrapped
更新现有的operator []=
对象。