NSMutableArray 将对象保留在 indexSet

NSMutableArray keep objects at indexSet

我在 Xcode 8.2,OSX 不是 iOS,Objective-C

我有一个 NSMutableArray 和一个 NSIndexSet。我想删除数组中除 NSIndexSet 中的所有项之外的所有项。所以基本上是

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

最好的方法是什么?我能以某种方式 'reverse' 设置索引吗?

您可以使用 objectsAtIndexes 获取对象并用结果替换整个对象。

NSArray *temp = [array objectsAtIndexes:indexSet];
[array replaceObjectsInRange:NSMakeRange(0, array.count) withObjectsFromArray: temp];

您可以构造给定 NSIndexSet 的逆函数,方法是构造一个索引集,该索引集的所有索引都在 0..arrayCount-1 范围内,包括在内,然后删除索引你的 indexSet 来自它:

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

您甚至可以在不创建不必要的数组的情况下执行此操作:

// 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
)

干杯