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];