Я смотрю на изменяемый класс Set
и вижу union
, intersect
, diff
и т. Д. Все эти операции с набором создают новый Set
. Мне было любопытно, есть ли способ обновить Set
, а не создать новый. В противном случае мне нужно переключиться с val
на var
, или мне нужно будет выполнить дополнительные шаги.Scala: Установить операции, которые обновляют коллекцию?
В случае, если я не понимаю, рассмотрим класс .NET HashSet
. Он имеет IntersectWith
, ExceptWith
и UnionWith
, которые изменяют коллекцию. В то время как методы расширения LINQ Intersect
, Except
и Union
создают новые коллекции. Я надеюсь найти что-то, что эквивалентно вариантам «С».
Вот неэффективный подход, который перестраивает коллекцию с нуля:
val temp = original.diff(other)
original.clear()
original ++= temp
Очевидно, что было бы более эффективным, чтобы сделать это:
for (value <- other if original.contains(value)) {
original.remove(value)
}
Вы имеете в виду switch 'var' to' val', может быть? :) – Alec
Нет, 'val' to' var'. Я хочу сохранить ту же ссылку на одну и ту же коллекцию. Я хочу * мутировать * эту коллекцию, а не заменять ссылку на новую коллекцию. –
Мой плохой. Совершенно верно. «Val» в изменяемый набор. Ошибка новичков. – Alec