飞镖中的反向映射

时间:2015-04-10 15:19:40

标签: dart

假设我在dart中有以下地图:

Map f = {
  0 : 0,
  1 : 1,
  2 : 0,
  3 : 1, 
  4 : 0,
  5 : 1
};

是否有飞镖中的某些内容,以便您可以轻松使用地图的反向地图f?例如,在这种情况下,逆映射f⁻¹[0](在数学符号中)应该等于集合0, 2, 4

4 个答案:

答案 0 :(得分:4)

Map f = {
  0 : 0,
  1 : 1,
  2 : 0,
  3 : 1,
  4 : 0,
  5 : 1
};

main() {
  print(f.keys.where((k) => f[k] == 0));
  // or 
  print(new Map.fromIterable(f.values.toSet(), 
    key: (k) => k, 
    value: (v) => f.keys.where((k) => f[k] == v)));
}

尝试DartPad

答案 1 :(得分:2)

quiver.dart库中还有BiMap类(尽管将库用于此目的可能有点过分了。)

Here是此类的实际使用示例。

答案 2 :(得分:2)

如果值是唯一的,那就只是:

Map inverse(Map f) {
 return f.map( (k, v) => MapEntry(v, k) );
}

它不会抱怨重复,它会覆盖它们。

答案 3 :(得分:1)

受枪手的回答启发:

Map inverse(Map f) {
  Map inverse = {};
  f.values.toSet().forEach((y) {
    inverse[y] = f.keys.where((x) => f[x] == y).toSet();
  });
  return inverse;
}

DartPad demo