NSMutableArray хранит объекты в indexSet

Я на Xcode 8.2, OSX не iOS, Objective-C

У меня есть NSMutableArray и NSIndexSet. Я хочу удалить все элементы массива за исключением тех, которые в NSIndexSet. Так что в принципе что-то вроде

[array keepObjectsAtIndexes:indexSet]; // just to carify i know this doesnt exist

Какой лучший способ сделать это? Могу ли я как-то "отменить" набор индексов?

3 ответа

Решение

Вы можете сделать это даже без создания ненужных массивов:

// Initial array
NSMutableArray* array = [[NSMutableArray alloc] initWithArray:@[@"one", @"two", @"three", @"four", @"five"]];

// Indices we want to keep
NSIndexSet* indexSet = [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange(1, 3)];

// Preparing reversed index set
NSMutableIndexSet *indexSetToRemove = [[NSMutableIndexSet alloc] initWithIndexesInRange:NSMakeRange(0, [array count])];
[indexSetToRemove removeIndexes:indexSet];

// Removing objects from that set
[array removeObjectsAtIndexes:indexSetToRemove];

Выход будет:

2017-05-11 20:10:22.317 Untitled 15[46504:32887351] (
    two,
    three,
    four
)

ура

Вы можете построить обратное заданному NSIndexSet путем построения набора индексов, который имеет все индексы в диапазоне 0..arrayCount-1включительно, а затем удаляя индексы в вашем indexSet от него:

NSMutableIndexSet *indexesToRemove = [NSMutableIndexSet initWithIndexesInRange:NSMakeRange(0, array.count)];
[indexesToRemove removeIndexes:indexesToKeep];
[array removeObjectsAtIndexes:indexesToRemove];

Вы можете получить объекты с objectsAtIndexes и заменить все объекты с результатом.

NSArray *temp = [array objectsAtIndexes:indexSet];
[array replaceObjectsInRange:NSMakeRange(0, array.count) withObjectsFromArray: temp];
Другие вопросы по тегам