Dart 在 Python 中有类似 `defaultdict` 的东西吗?
Does Dart have something like `defaultdict` in Python?
我想做的就是下面这个。
如果可能的话,你能教我怎么做吗?
import 'package:my_package/data_object.dart';
Map<String, List<DataObject>> m = Map<int, List<DataObject>>(); // Create an empty map.
m['001'].add(DataObject(something: something)); // Can add DataObject without checking if '001' exists.
m['002'].add(DataObject(something: something));
您可以在 Map
上使用 putIfAbsent
方法来创建和插入例如地图的空列表(如果尚不存在):https://api.dart.dev/stable/2.7.2/dart-core/Map/putIfAbsent.html
void main() {
Map<String, List<int>> m = {};
m.putIfAbsent('001', () => []).add(1);
m.putIfAbsent('001', () => []).add(2);
m.putIfAbsent('002', () => []).add(3);
print(m); // {001: [1, 2], 002: [3]}
}
备选方案
如果你要经常使用这个模式,那么实现你自己的 Defaultdict 会更容易 class 这并不复杂,因为我们只是希望它表现得像一个 Map:
import 'dart:collection';
class Defaultdict<K, V> extends MapBase<K, V> {
final Map<K, V> _map = {};
final V Function() _ifAbsent;
Defaultdict(this._ifAbsent);
@override
V operator [](Object? key) => _map.putIfAbsent(key as K, _ifAbsent);
@override
void operator []=(K key, V value) => _map[key] = value;
@override
void clear() => _map.clear();
@override
Iterable<K> get keys => _map.keys;
@override
V? remove(Object? key) => _map.remove(key);
}
void main() {
// Create a Defaultdict where we return a empty new list for unknown keys
final m = Defaultdict<String, List<int>>(() => []);
m['001'].add(1);
m['001'].add(2);
m['002'].add(3);
print(m); // {001: [1, 2], 002: [3]}
}
我通常会尽可能使用??=
:
var m = <String, List<DataObject>>{};
(m['001'] ??= []).add(DataObject(something: something));
(m['002'] ??= []).add(DataObject(something: something));
请注意,这与使用 putIfAbsent
不完全相同,因为它将覆盖键存在但值为 null
的条目。如果您从不在 Map
中存储 null
,请使用您认为更干净的那个。
我想做的就是下面这个。 如果可能的话,你能教我怎么做吗?
import 'package:my_package/data_object.dart';
Map<String, List<DataObject>> m = Map<int, List<DataObject>>(); // Create an empty map.
m['001'].add(DataObject(something: something)); // Can add DataObject without checking if '001' exists.
m['002'].add(DataObject(something: something));
您可以在 Map
上使用 putIfAbsent
方法来创建和插入例如地图的空列表(如果尚不存在):https://api.dart.dev/stable/2.7.2/dart-core/Map/putIfAbsent.html
void main() {
Map<String, List<int>> m = {};
m.putIfAbsent('001', () => []).add(1);
m.putIfAbsent('001', () => []).add(2);
m.putIfAbsent('002', () => []).add(3);
print(m); // {001: [1, 2], 002: [3]}
}
备选方案
如果你要经常使用这个模式,那么实现你自己的 Defaultdict 会更容易 class 这并不复杂,因为我们只是希望它表现得像一个 Map:
import 'dart:collection';
class Defaultdict<K, V> extends MapBase<K, V> {
final Map<K, V> _map = {};
final V Function() _ifAbsent;
Defaultdict(this._ifAbsent);
@override
V operator [](Object? key) => _map.putIfAbsent(key as K, _ifAbsent);
@override
void operator []=(K key, V value) => _map[key] = value;
@override
void clear() => _map.clear();
@override
Iterable<K> get keys => _map.keys;
@override
V? remove(Object? key) => _map.remove(key);
}
void main() {
// Create a Defaultdict where we return a empty new list for unknown keys
final m = Defaultdict<String, List<int>>(() => []);
m['001'].add(1);
m['001'].add(2);
m['002'].add(3);
print(m); // {001: [1, 2], 002: [3]}
}
我通常会尽可能使用??=
:
var m = <String, List<DataObject>>{};
(m['001'] ??= []).add(DataObject(something: something));
(m['002'] ??= []).add(DataObject(something: something));
请注意,这与使用 putIfAbsent
不完全相同,因为它将覆盖键存在但值为 null
的条目。如果您从不在 Map
中存储 null
,请使用您认为更干净的那个。