【问题标题】:Dart Map comprehension飞镖地图理解
【发布时间】:2023-03-31 01:56:01
【问题描述】:

在python中我会写:

{a:0 for a in range(5)}

得到

{0: 0, 1: 0, 2: 0, 3: 0, 4: 0}

我怎样才能在 Dart 中达到同样的效果?

到目前为止,我有这个:

List<Map<String, double>>.generate(5, (i) => { i: 0 });

但这会生成地图列表[{0: 0}, {1: 0}, {2: 0}, {3: 0}, {4: 0}]

虽然我想要一张简单的地图

【问题讨论】:

    标签: dart


    【解决方案1】:

    Dart 有一个 collection for 语法,类似于 Python 的理解。 Dart Language Tour provides examples for Lists,但它也可以用于Sets 和Maps:

    final map = {for (var a = 0; a < 5; a += 1) a: 0};
    

    您可以咨询feature specification了解更多详情。

    【讨论】:

    • 你总是会出奇制胜 :)
    【解决方案2】:

    如果您想要使用一行的解决方案,您可以这样做:

    void main() {
      final map = Map.fromEntries(Iterable.generate(5, (i) => MapEntry(i, 0)));
      print(map); // {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}
    }
    

    【讨论】:

      【解决方案3】:
      Map<int, int> map = {};
      for (int i = 0; i < 5; i++) {
        map[i] = 0;
      }
      

      打印

      {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}
      

      编辑:

      你也可以试试这个方法:

      List<int> list1 = List.generate(5, (i) => i);
      List<int> list2 = List.generate(5, (i) => 0);
      var map = Map.fromIterables(list1, list2);
      

      【讨论】:

      • 有没有办法在一行中创建它“内联”/?
      • 你总是可以用它做一个函数。如果它会降低代码的可读性,请不要将其作为目标。
      • 提示:您的第二个解决方案确实使用了更多内存,并且您不需要创建列表,因为fromIterablesIterable 作为参数。所以使用Iterable.generate(5, (i) =&gt; i)Iterable.generate(5, (_) =&gt; 0)效率更高。
      • @julemand101 我同意Iterables 在性能方面更好,但通常它限制用户拥有List 提供的更多功能,所以为了使答案易于理解和更有用,我使用了List
      • @Caramiriel,谢谢你的好建议。尽管我同意你对代码可读性的看法,但我的目标是了解如何创建单线 Map。做不到让我感到手足无措。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      • 2022-11-15
      • 1970-01-01
      相关资源
      最近更新 更多