gpt4 book ai didi

flutter - 在嵌套 map 内的列表中添加和删除值会影响所有嵌套 map

转载 作者:行者123 更新时间:2023-12-03 02:47:32 24 4
gpt4 key购买 nike

几天来我一直在为这个问题苦苦挣扎,我通常不是在这里提问的人,但这次我真的很好奇我将如何解决这个问题..

问题是,我有一个 Map 是假设赛马优惠券 ( <int, ) 的“唯一标识符”,还有一个表示假设比赛的(键:用于列)和(值:用于行)的 Map和每场比赛中的马,所以这个变量看起来像这样:(Map<int, Map<int, List<int>>> couponData = new Map();)。

打印这样的结果例如:

{1: {0: [1,6], 1: [], 2: [2,6], 3: [], 4: [3,6,7,8], 5: [], 6: []}}

或者更直白点:

{Coupon1: {Race1: [Horse1,Horse6], Race2: [], Race3: [Horse2,Horse6], Race4: [], Race5: [Horse3,Horse6,Horse7,Horse8], Race6: [], Race7: []}}

现在一切正常。然而,我的问题是,当我将新马添加到每场比赛(或列表)或删除它们时。

如果我有多个优惠券并且只想在我的另一张优惠券中更换一匹马,它会影响所有优惠券,而不仅仅是我当前选择的那匹马。所以代码看起来像这样:

int activeCoupon = 1;

if (!couponData[activeCoupon][raceNumber].contains(horseNumber + 1)) {
couponData[activeCoupon][raceNumber].add(horseNumber + 1);
} else {
couponData[activeCoupon][raceNumber].remove(horseNumber + 1);
}

在我的第一张优惠券(共 2 张)上的第一场比赛中选择马 1 和马 2 并在控制台中打印优惠券数据现在如下所示:

{1: {0: [1, 2], 1: [], 2: [], 3: [], 4: [], 5: [], 6: []}, 2: {0: [1, 2], 1: [], 2: [], 3: [], 4: [], 5: [], 6: []}}

这意味着它已将 Horse 1 和 Horse 2 添加到两张优惠券中,即使我指定我想在第一个优惠券中添加或删除因此 ( activeCoupon = 1 )。我在嵌套 map 中添加和删除列表有什么问题吗?

我尝试了很多不同的方法,例如进入 .forEach 并手动添加和删除与各个种族和马匹相关的值,但结果相同..

关于我将如何以不同方式执行此操作的任何线索?干杯

最佳答案

您实际上没有指定问题中的重要部分,但通过了解 Map 的方式s 和 List的工作,我可以说出问题是什么:你没有正确地初始化它们。

事情是,MapList指向内存中的位置以及执行以下操作时:

final map1 = {};
final map2 = map1;

您现在将拥有两个指向内存中相同位置的 map ,因此编辑 map1也会影响map2 .

话虽如此,我可以给你一些重要的提示:

  • 在构建您的(可能不是理想的优惠券赛马数据结构)时,请确保您将每个条目分配给具有实际不同值的 map ,即不要创建您的 6比赛一次,然后将它们“复制”到您的其他优惠券,但为每张优惠券创建它。

  • 您可以使用 List.of Map.of 复制 map 或列表,但请注意这不是复制,这意味着复制 Map<int, List<int>>不会为您复制列表,这意味着它们仍然是相同的。

  • 在您的问题中包括您所做的与您的问题相关的所有事情 - 这里您没有包括唯一相关的部分:创建您的 Map<int, Map<int, List<int>> .

阅读this Wikipedia article了解有关复制的更多信息。


浅拷贝问题

我只想快速说明这一点,以确保您明白这一点:

final map1 = {
1: [1, 2],
2: [3, 4],
};

final map2 = Map.of(map1);

您可能会想:“哦,我按照建议使用 Map.of 复制了我的数据。现在我应该没事了。”然而,这是一个谬误,因为您的 map 中仍然有您的列表,这些列表被复制,因此会发生以下情况:

map1[1].remove(2);

print(map1[1]); // [1]
print(map2[1]); // [1]

如您所见,两张 map 中的列表都已更改。如果你还想只复制列表的内容,你需要这样做:

final map2 = {};

for (final entry in map1.entries) {
map2[entry.key] = List.of(entry.value);
}

这是一个深拷贝,完整的代码如下所示:

void main() {
final map1 = {
1: [1, 2],
2: [3, 4],
};

final map2 = {};

for (final entry in map1.entries) {
map2[entry.key] = List.of(entry.value);
}

map1[1].remove(2);

print(map1[1]); // [1]
print(map2[1]); // [1, 2]
}

关于flutter - 在嵌套 map 内的列表中添加和删除值会影响所有嵌套 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59506408/

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