是否有任何类型的集合来声明具有链接到相同值的多个键的映射?
我希望在声明 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 []=对象。

10-06 04:03