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;
}
quiver.dart 库中还有 BiMap
class(尽管仅将一个库用于这个单一目的可能有点矫枉过正)。
Here 是这个 class.
的真实用法示例
如果值是唯一的,那么它只是:
Map inverse(Map f) {
return f.map( (k, v) => MapEntry(v, k) );
}
它不会抱怨重复,而是会覆盖它们。
假设我在 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;
}
quiver.dart 库中还有 BiMap
class(尽管仅将一个库用于这个单一目的可能有点矫枉过正)。
Here 是这个 class.
的真实用法示例如果值是唯一的,那么它只是:
Map inverse(Map f) {
return f.map( (k, v) => MapEntry(v, k) );
}
它不会抱怨重复,而是会覆盖它们。