有没有一种方法可以使用 Dart/Flutter 在 ForEach 中访问 index/key

Is there a way to access the index/key in a ForEach with Dart/Flutter

我正在尝试 运行 以下 foreach 循环,以便我可以删除特定条目。

textMap.results.forEach((element) {
   textMap.results.removeAt(**element.KEY**);
   print(element.KEY)
}

是否可以引用 foreach 循环的 index/key? 我已经用一个基本的迭代器对此进行了测试,但是如果列表包含多个需要删除的条目,那么一旦删除了初始项目,索引就会变得不同步。因此,为什么我要寻找 index/key

第一,avoid using Iterable.forEach except for trivial cases. If you want element indices, just use a normal looping construct (e.g. for, while). Also see .

在您的示例代码中,您无条件地删除了每个项目,因此您可以在最后调用 List.clear(),这样会更简单、更高效。那应该是 O(1).

如果您不想删除 所有 项目而是需要 有条件地 删除多个项目,有几种方法可以做到。

  • 尽可能使用List.removeWhere。我希望关于列表的长度是 O(n)。

  • 从最后到第处理项目,以便从列表中删除元素不会影响迭代:

    for (var i = textMap.results.length - 1; i >= 0; i -= 1) {
      print(textMap.results[i]); // Do something with the element.
      if (shouldRemove(textMap.results[i])) {
        textMap.results.removeAt(i);
      }
    }
    
  • 如果必须按顺序处理元素,可以先收集要移除的索引列表,然后分别移除:

    var indicesToRemove = <int>[];
    for (var i = 0; i < textMap.results.length; i += 1) {
      print(textMap.results[i]); // Do something with the element.
      if (shouldRemove(textMap.results[i])) {
        indicesToRemove.add(i);
      }
    }
    // Remove in reverse order so that removing items does not affect
    // unprocessed indices.
    for (var index in indicesToRemove.reversed) {
      textMap.results.removeAt(index);
    }
    
  • 或者使用 while 循环有条件地递增列表索引:

    var i = 0;
    while (i < textMap.results.length) {
      print(textMap.results[i]); // Do something with the element.
      if (shouldRemove(textMap.results[i])) {
        textMap.results.removeAt(i);
        // Iterate again at the same index.
        continue;
      }
      i += 1;
    }
    

最后三种方法是 O(m*n),其中 n 是列表的长度,m 是要删除的项目数。