Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Множества (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)