我实际上在Dart中使用map
,我不明白为什么示例中的map
变量行为异常,或者我在代码中做错了什么。
请有人帮我调试代码,我已经发布了代码来重现这个问题。
example.dart
void main() {
var data2 = {};
var data1 = {};
var floorDetails = new Map();
floorDetails.clear();
for (int i = 0; i < 2; i++) {
data2.clear();
data1.clear();
for (int j = 0; j < 2; j++) {
data1 = {
'flat${(i + 1) * 100 + (j + 1)}': {'flattype': "flat"},
};
data2.addAll(data1);
}
print('data2=$data2');
floorDetails['floor${(i+1)}'] = data2;
print('floorDetails = $floorDetails');
}
print(floorDetails.keys);
}
代码的输出为:
floorDetails = {
floor1: {
flat201: {flattype: flat},
flat202: {flattype: flat}
},
floor2: {
flat201: {flattype: flat},
flat202: {flattype: flat}
}
}
事实上,我原以为输出是:
floorDetails = {
floor1: {
flat101: {flattype: flat},
flat102: {flattype: flat}
},
floor2: {
flat201: {flattype: flat},
flat202: {flattype: flat}
}
}
这实际上是根据Map.addAll()
方法的文档覆盖map
floorDetails
内所有密钥的值
void addAll( Map<K, V> other )
将other的所有键值对添加到此映射。
如果other的键已经在此映射中,则其值将被覆盖。
该操作相当于对每个键和其他键中的关联值执行
this[key] = value
。它对其他的进行迭代,因此在迭代过程中不能改变。
尽管在给定的示例中键不同,但它仍然覆盖值。
请帮忙,我们将不胜感激。非常感谢,Mahi
在第一次迭代中,在这里分配data2
floorDetails['floor${(i+1)}'] = data2;
但下一次迭代的第一行是
data2.clear();
其清除CCD_ 8。这也会清除floorDetails['floor1']`的内容,因为它引用了相同的映射。
要么你创建一个新地图,而不是通过更改来清除它
data2.clear();
data1.clear();
至
data2 = {}; // or new Map()
data1 = {};
或者在指定之前创建地图的副本
floorDetails['floor${(i+1)}'] = new Map.from(data2);
Map是一个对象,通过引用进行复制。只有像bool
、double
、int
和String
这样的基元类型才会按值复制。