gpt4 book ai didi

dart - Dart 中的 Map 正在用最后更新的值替换先前键的值

转载 作者:行者123 更新时间:2023-12-04 12:47:21 28 4
gpt4 key购买 nike

我实际上正在使用 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
)

Adds all key-value pairs of other to this map.

If a key of other is already in this map, its value is overwritten.

The operation is equivalent to doing this[key] = value for each key and associated value in other. It iterates over other, which must therefore not change during the iteration.

虽然在给定的示例中键不同,但它仍然会覆盖值。

拜托,任何帮助将不胜感激。非常感谢,鲯鳅鱼

最佳答案

在第一次迭代中,您在这里分配 data2

floorDetails['floor${(i+1)}'] = data2;

但是下一次迭代的第一行是

data2.clear();

清除 data2。这也会清除 floorDetails['floor1']` 的内容,因为它引用了同一张 map 。

要么创建一个新 map ,而不是通过更改清除它

data2.clear();
data1.clear();

data2 = {}; // or new Map()
data1 = {};

或者在分配之前创建 map 的副本

floorDetails['floor${(i+1)}'] = new Map.from(data2);

Map 是一个对象并通过引用复制。只有 booldoubleintString 等原始类型按值复制。

关于dart - Dart 中的 Map 正在用最后更新的值替换先前键的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47260179/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com