Dart:如何更新 Set 中的值

3 dart

如何更新索引处的值 0

Set<int> set = {1, 2, 3};
set[0] = 0; // error
Run Code Online (Sandbox Code Playgroud)

笔记:

我不是在寻找像 convert Setto那样的解决方法List,添加元素并进一步将其转换回Set

lrn*_*lrn 7

集合元素仅附带索引,因为它们是可迭代的。您不能“更新位置 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()


Nik*_*nen 5

您不能直接使用索引更改集合中的值,但可以使用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)