Dictionary Dart在Python中是否有类似“defaultdict”的东西?

Dictionary Dart在Python中是否有类似“defaultdict”的东西?,dictionary,flutter,dart,default,Dictionary,Flutter,Dart,Default,我想做的是下面这个。 如果可能的话,你能教我怎么做吗 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 DataOb

我想做的是下面这个。 如果可能的话,你能教我怎么做吗

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));
您可以使用地图上的putIfAbsent方法来创建和插入地图上尚未存在的空列表:

替代解决方案 如果要经常使用此模式,只需实现自己的Defaultdict类就更容易了,因为我们只希望它的行为像一个映射:

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]}
}
您可以使用地图上的putIfAbsent方法来创建和插入地图上尚未存在的空列表:

替代解决方案 如果要经常使用此模式,只需实现自己的Defaultdict类就更容易了,因为我们只希望它的行为像一个映射:

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={}; m['001']??=[]添加数据对象某物:某物; m['002']??=[]添加数据对象某物:某物; 请注意,这与使用putIfAbsent不同,因为它将覆盖键存在但值为null的条目。如果您的地图中从未存储空值,请使用您认为更干净的选项。

我通常使用???=如果可能:

var m={}; m['001']??=[]添加数据对象某物:某物; m['002']??=[]添加数据对象某物:某物;
请注意,这与使用putIfAbsent不同,因为它将覆盖键存在但值为null的条目。如果您从未在地图中存储空值,则使用您认为更干净的选项。

使用defaultdict类示例的替代解决方案更新。使用defaultdict类示例的替代解决方案更新。