有没有一种方法可以使用 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 是要删除的项目数。
我正在尝试 运行 以下 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 是要删除的项目数。