Flutter dart Map 具有多个键且值完全相同

Ant*_*REL 6 dictionary dart flutter

是否有任何类型的集合来声明具有链接到同一值的多个键的映射?

我希望地图在声明的同时进行初始化。理想情况下是这样的:

MyMap<String, String> mymap = {['red', 'blue', 'green'] : 'Rock', ['pink', 'yellow' ...etc}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我在文档中找到了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)});

Run Code Online (Sandbox Code Playgroud)

然后每当我访问 OKBoomer['red'] 时,我都会得到“Rock”。

我也在考虑HashMap

强烈感谢任何帮助!

jam*_*lin 3

您不一定需要任何特殊的数据结构;一个法线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;
}
Run Code Online (Sandbox Code Playgroud)

然后你应该能够做到:

var mymap = makeMyMap({
  ['red', 'blue', 'green'] : 'Rock',
  ['pink', 'yellow', 'cyan']: 'Funk',
});
Run Code Online (Sandbox Code Playgroud)

请注意,上述内容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
Run Code Online (Sandbox Code Playgroud)

您可以从中派生一个类DelegatingMap,以便在使用时自动解包值operator []并自动更新 的现有Wrapped对象operator []=