Попытка получить доступ к некоторым элементам в IndexSet

Я использую IndexSet и я пытаюсь получить доступ к некоторым индексам, которые иногда являются последовательными, а в других - нет.

Например, мой набор может содержать [1, 2, 3, 5, 6, 7, 13, 31]

Я хочу вытащить из набора целый ряд 3...13, но у меня проблемы с синтаксисом. Я узнал, как использовать команды функций из документации Apple, используя myIndexSet.sorted(), Тем не менее, документация Apple не дает пример того, как получить доступ к ряду элементов в наборе. Документация Apple по доступу к элементам в наборе индексов:

subscript(Range<IndexSet.Index>)

Я попробовал несколько способов написать это, но не могу понять, как это сделать правильно. Может кто-нибудь показать мне, как получить доступ к ряду элементов в наборе, чтобы создать новый набор? Я пробовал такие вещи, как:

let subset = subscript(Range: myLargerSet.3...13)

но это не похоже на работу.

Спасибо

3 ответа

Решение

То, что вы ищете, это пересечение вашего IndexSet ([1, 2, 3, 5, 6, 7, 13, 31]) с другим IndexSet ([3, 4, ..., 12, 13]):

let yourIndexSet: IndexSet = [1, 2, 3, 5, 6, 7, 13, 31]
let desiredIndexRange = IndexSet(3...13)
let indicesOfInterest = yourIndexSet.intersection(desiredIndexRange)
print(indicesOfInterest.sorted()) // => [3, 5, 6, 7, 13]

Вы можете получить доступ к фрагменту вашего оригинального набора следующим образом:

let slice = indexSet[indexSet.indexRange(in: 3...13)]

slice получает доступ к существующим элементам на месте, поэтому создание среза O(1)

Одним из возможных решений является использование фильтра для создания нового IndexSet,

let set = IndexSet(arrayLiteral: 1,2,3,5,6,7,13,31)
let subset = set.filteredIndexSet { (index) -> Bool in
    index >= 3 && index <= 13
}
Другие вопросы по тегам