【问题标题】:How to update keys of map in dart如何在飞镖中更新地图的键
【发布时间】:2021-06-01 01:50:57
【问题描述】:

我有一个简单的地图“对象”让我们假设:

{
ServoP180V1: {X: 100.0, Y: 0.0}, 
ServoP180V3: {X: 100.0, Y: 0.0}
ServoP180V5: {X: 100.0, Y: 0.0}
}

我如何对键进行排序,使其按顺序排列,如下所示:

{
ServoP180V1: {X: 100.0, Y: 0.0}, 
ServoP180V2: {X: 100.0, Y: 0.0}
ServoP180V3: {X: 100.0, Y: 0.0}
}

我试过这段代码,但有时返回 null 有问题,不确定我的方法是否正确

  sortObjects() {
    int i = 1;
    for (var key in objects.keys) {
      objects.update(
        key.substring(0, key.length - 1) + i.toString(),
        null,
      );
      i++;
    }
  }
The method 'call' was called on null.
Receiver: null
Tried calling: call()

也是这样

  sortObjects() {
    int i = 1;
    objects.forEach((key, value) {
      objects.update(
        key.substring(0, key.length - 1) + i.toString(),
        (existingValue) => value,
        ifAbsent: () => value,
      );
      i++;
    });
  }

给出这样的错误

Exception: Concurrent modification during iteration: 

提前谢谢你!

【问题讨论】:

  • 您似乎正在将键从旧结构更改为新结构。什么是.update?

标签: algorithm flutter dart async-await hashmap


【解决方案1】:
void main(List<String> args) {
  final objects = {
    'ServoP180V1': {'X': 100.0, 'Y': 0.0}, 
    'ServoP180V3': {'X': 100.0, 'Y': 0.0},
    'ServoP180V5': {'X': 100.0, 'Y': 0.0}
  };

  var keys = objects.keys.toList()..sort();
  var newData = <String, Map<String, double>>{};

  keys.forEach((k) => newData[k] = objects[k]);

  print(newData);
}

结果:

{ServoP180V1: {X: 100.0, Y: 0.0}, ServoP180V3: {X: 100.0, Y: 0.0}, ServoP180V5: {X: 100.0, Y: 0.0}}

【讨论】:

    【解决方案2】:

    所以您在 foarch 循环期间更改密钥,这是非法的。我会通过生成另一张地图然后替换旧地图来更改密钥。这是一个答案。

    Map.update()

    map 的update 方法只更新key 的内容并且只在key 存在的情况下更新,但不改变key 本身。我没有找到与在运行时更改地图键相关的任何内容。

    Map<String, dynamic> oldMap = {
      "ServoP180V1": {"X": 100.0, "Y": 0.0},
      "ServoP180V3": {"X": 100.0, "Y": 0.0},
      "ServoP180V5": {"X": 100.0, "Y": 0.0}
    };
    Map<String, dynamic> newMap = {};
    int i = 1;
    oldMap.keys.toList().forEach((key) {
      newMap.addAll({
        "${key.substring(0, key.length - 1)}$i":
            oldMap[key]
      });
      i++;
    });
    print(oldMap);
    print(newMap);
    

    结果:

    {ServoP180V1: {X: 100.0, Y: 0.0}, ServoP180V3: {X: 100.0, Y: 0.0}, ServoP180V5: {X: 100.0, Y: 0.0}}
    {ServoP180V1: {X: 100.0, Y: 0.0}, ServoP180V2: {X: 100.0, Y: 0.0}, ServoP180V3: {X: 100.0, Y: 0.0}}
    

    【讨论】:

    • 感谢@Chance,使用临时地图是关键解决方案。我只是曾经认为也许有办法直接在地图中做到这一点)))
    猜你喜欢
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 2020-05-10
    相关资源
    最近更新 更多