3 dart
如何更新索引处的值 0
Set<int> set = {1, 2, 3};
set[0] = 0; // error
Run Code Online (Sandbox Code Playgroud)
笔记:
我不是在寻找像 convert Setto那样的解决方法List,添加元素并进一步将其转换回Set
集合元素仅附带索引,因为它们是可迭代的。您不能“更新位置 x 处的值”,因为任何更新都可能更改顺序。
我假设您确实希望保留迭代顺序(在这种情况下,您确实应该使用列表!),因此以下内容不起作用:
void update<T>(Set<T> elements, int index, T newValue) {
set.remove(set.elementAt(index));
set.add(newValue);
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是您不会保留迭代顺序,您添加的新值可能在迭代结束时(如果您使用的是插入顺序集),或者顺序可能已经完全改变(如果您是不是)。
一种适用于插入有序集的方法:
void replace<T>(Set<T> set, int index, T newValue) {
if (set.contains(newValue)) throw StateError("New value already in set");
int counter = 0;
while (counter < set.length) {
var element = set.first;
set.remove(element);
if (counter == index) element = newValue;
set.add(element);
}
}
Run Code Online (Sandbox Code Playgroud)
这会重复删除集合中的第一个元素,然后再次插入它,除了index第 th 个元素,它会在其中插入newValue。这仅适用于插入顺序集(如 default LinkedHashSet)。(请注意,如果newValue已经在集合中,这将不起作用,所以我在这种情况下抛出了它)。
对于所有其他集合,没有更好的解决方案(set.toList()..[index] = newValue).toSet()。
您不能直接使用索引更改集合中的值,但可以使用map.
Set<int> set = {1, 2, 3};
Set<int> updated = set.map((item) => item == 1 ? 0 : item).toSet();
print(updated); // => {0, 2, 3}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2896 次 |
| 最近记录: |