dart 中的逆向映射

Inverse mapping in dart

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

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

dart 里有没有什么东西可以方便地使用地图的逆向地图f?因此,例如,在这种情况下,逆映射 f⁻¹[0](以数学符号表示)应该等于集合 0, 2, 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

受 gunter 的回答启发:

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

quiver.dart 库中还有 BiMap class(尽管仅将一个库用于这个单一目的可能有点矫枉过正)。

Here 是这个 class.

的真实用法示例

如果值是唯一的,那么它只是:

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

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