2016-07-22 4 views
0

Я смотрю на изменяемый класс 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) 
} 
+0

Вы имеете в виду switch 'var' to' val', может быть? :) – Alec

+0

Нет, 'val' to' var'. Я хочу сохранить ту же ссылку на одну и ту же коллекцию. Я хочу * мутировать * эту коллекцию, а не заменять ссылку на новую коллекцию. –

+0

Мой плохой. Совершенно верно. «Val» в изменяемый набор. Ошибка новичков. – Alec

ответ

2

См: http://docs.scala-lang.org/overviews/collections/sets.html#operations-in-class-mutableset

Например:

Дополнения: xs + = x Добавляет элемент x для установки xs как побочного эффекта, а возвращает xs.

Так что просто игнорируйте возвращаемое значение. Набор должен быть обновлен на месте.

+0

Представьте себе, что я хотел взять 'diff', чтобы исходный' Set' больше не содержал значения в другом наборе. Оригинальная коллекция должна сокращаться. Мне нужно было бы найти элементы, которые нужно удалить, а затем '- =' их из исходного набора. Следующий? –

+2

Ну, это не то, что вы спросили :-) Вы можете '- =' последовательность элементов, которые должны иметь нужный эффект. '- =' не должен влиять на элементы, которые не входят в набор. –