Множества (Set[V], set[V])
Общая информация
Множества не являются конструкцией языка, а реализованы при помощи обобщенных трейта Set[V] и метода set[V], определенных в пакете libretto.
Множество (Set) - это коллекция, которая содержит элементы. Проверка на вхождение элемента в множество эффективна (в отличие от простой последовательности). Но у множества отсутствует порядок, а элементы в множестве содержатся только в единственном экземпляре.
Это изменяемое отображение: изменения осуществляются “по месту”, а не возвратом нового экземпляра.
Тип Set[V]
В пакете libretto определен трейт Set:
trait Set[V] {
def set(v: V): Unit?
def remove(v: V): Unit?
def `!`(V: V): Unit?
def values: general(V, Nothing*)
def clear: ()
def len: Int
}
Требования к типу элемента [V]: это тип без кардинальности (строго одно значение). Допускаются объединения.
Требования к элементам
Тип элемента должен выполнять правила сравнения и вычисления хэша. Это автоматически выполняется для структур, но не выполняется для трейтов. Поэтому в качестве типа элементов можно использовать либо предопределенные структуры Int, Real, String, Unit, либо структуры. Статической проверки компилятором этого правила нет.
Поведение для структуры в качестве элементов множества может изменяться определением equalityKey для этой структуры. См. соответствующее описание.
Создание: set[V]
Для создания Set используется метод (в условной записи) из пакета libretto:
def set[V]: Set[V]
Методы в Set
Трейт Set определяет следующие методы:
set служит для добавления элемента (в случае его отсутствия). Возвращает unit, если элемент добавлен. И (), если элемент уже был в Set.
remove удаляет элемент (при его наличии). Возвращает unit, если элемент был и удален. И (), если элемента не было.
! служит для проверки вхождения элемента в Set.
values возвращает содержимое Set как последовательность. Операция довольно медленная, поскольку создаётся копия. Порядок элементов в возвращаемой последовательности может быть любым. Нужно сортировать последовательность, если порядок важен.
clear очищает Set, удаляя все элементы (если они есть).
len возвращает число элементов в Set.
Пример
use libretto/util
def info(str: String, v: Any*): () = {
println: str+": "+util/string(v)
()
}
def main = {
fix s = set[Int]
info("len"): s.len
info("values"): s.values
info("set(777)"): s.set(777)
info("len"): s.len
info("values"): s.values
info("!(777)"): s.!(777)
info("set(777)"): s.set(777)
info("set(123)"): s.set(123)
info("len"): s.len
info("values"): s.values
info("!(123)"): s.!(123)
info("!(777)"): s.!(777)
info("!(900)"): s.!(900)
info("remove(123)"): s.remove(123)
info("!(123)"): s.!(123)
info("remove(123)"): s.remove(123)
info("len"): s.len
info("values"): s.values
println("clear")
info("len"): s.len
println
fix s2 = set[String]
0..9 as v.${ s2.set("test"+v) }
println: s2.values
println: s2.values.*sort($)
}
Выдаёт:
len: 0
values: ()
set(777): unit
len: 1
values: 777
!(777): unit
set(777): ()
set(123): unit
len: 2
values: (777,123)
!(123): unit
!(777): unit
!(900): ()
remove(123): unit
!(123): ()
remove(123): ()
len: 1
values: 777
clear
len: 1
(test4,test5,test2,test3,test8,test9,test6,test7,test0,test1)
(test0,test1,test2,test3,test4,test5,test6,test7,test8,test9)