Класс NSSet представляет неупорядоченную коллекцию раздельных объектов. Слово “раздельный” здесь означает, что в коллекции не должно быть двух одинаковых объектов, при сравнении которых с помощью метода isEqual: последний возвращает логическое значение YES.

Выяснить, присутствует ли объект во множестве, оказывается намного эффективнее, чем искать его в массиве. Кроме того, можно узнать, является одно множество подмножеством другого или пересекает его; обойти (перечислить) множество с помощью конструкции for.. . in, хотя порядок его обхода не определен; а также отфильтровать множество подобно массиву. Разумеется, большая часть операций над множеством сродни операциям над массивом, за исключением того, что с множеством, предполагающим обозначение его упорядочения, вряд ли можно что-нибудь сделать.

Для того чтобы преодолеть и это ограничение, можно воспользоваться упорядоченным множеством. Такое множество (типа NSOrderedSet) очень похоже на массив, а методы обращения с ним подобны методам обработки массива. Более того, в классе NSOrderedSet реализован метод objectAtlndexedSubscriptпозволяющий извлекать элементы из

множества посредством индексирования. В то же время элементы упорядоченного множества должны быть раздельными. Упорядоченное множество дает немало преимуществ, присущих множествам. Например, аналогично множеству типа NSSet, выяснить, присутствует ли объект в упорядоченном множестве, оказывается намного эффективнее, чем искать его в массиве. Кроме того, упорядоченные множества можно объединять, пересекать или вычитать одно из другого. Так как раздельность элементов множества зачастую, да и вообще не является ограничением, поскольку они все равно должны каким-то образом отличаться, то при всякой возможности лучше пользоваться множеством типа NSOrderedSet, чем множеством типа NSArray.

 

 

Превращение массива в упорядоченное множество делает его однозначным. Это означает, что он остается упорядоченным, но только первое вхождение одинакового объекта переносится во множество.

 

Класс NSSet является неизменяемым. Одно множество типа NSSet можно вывести из другого, введя или удалив элементы или же воспользовавшись подклассом NSMutableSet. Аналогично у класса NSOrderedSet имеется изменяемый эквивалент — класс NSMutable OrderedSet, в котором реализован метод setObjectiatlndexedSubscript:. Операция ввода или вставки в изменяемое множество объекта, который уже в нем существует, не накладывает никаких дополнительных издержек, поскольку ничего и не вводится (в силу соблюдаемого правила раздельности элементов множества). Впрочем, это не приводит к ошибке.

Подкласс NSCountedSet является производным от класса NSMutableSet и представляет изменяемое неупорядоченное множество объектов, которые совсем не обязательно должны быть раздельными. Как правило, оно называется множеством с повторяющимися элементами. Оно реализуется как обычное множество с дополнительным подсчетом количество раз, когда в него был введен каждый элемент.


 

 

 

Добавить комментарий