Как создать диапазоны из NSArray путем фильтрации соответствующих условий? - PullRequest
0 голосов
/ 14 ноября 2018
NSArray *objects = @[object1, object2, object3, object1, object5, object1, object6, object7];

Как было бы лучше получить диапазоны, разделенные object1, следующим образом:

(0-2 3-4 5-7)

Мне известен этот метод для создания NSIndexSet из массива, но я не уверен, каким образом я мог бы использовать его для достижения вышеуказанного набора индексов.

NSIndexSet*indexSet = [objects indexesOfObjectsPassingTest:^(id object, NSUInteger idx, BOOL *stop) {
    return ; //Do some checks
}];

Использование objects.count также может быть полезно для конечного диапазона, но я не уверен в наилучшем способе сделать это.

1 Ответ

0 голосов
/ 14 ноября 2018

NSIndexSet на самом деле не поможет, так как вы используете диапазоны, а не индексы.

Вы можете просто перебрать массив в поисках вашего сторожевого объекта object1, добавив в массив экземпляры NSRange.

За исключением того, что NSRange является структурой, поэтому вы не можете добавлять экземпляры напрямую к NSMutableArray. Есть несколько вариантов:

  1. (И это будет мой первый выбор): используйте Swift вместо Objective-C
  2. Создание пользовательского объекта для переноса NSRange
  3. Используйте NSValue, чтобы обернуть NSRange
  4. Используйте массив C вместо NSArray

Я собираюсь использовать вариант 2, поскольку вариант 3 включает в себя возиться с необработанными байтами базовой структуры.

Range.h

@interface Range : NSObject

@property (readonly) NSRange range;

- (id) initWithRange: (NSRange) range
@end

Range.m

импорт "Range.h"

@ Диапазон реализации

- (id) initWithRange: (NSRange) range {
    if (self = [super init]) {
        _range = range;
    }

    return self;
}

@end

YourCode.m

-(NSArray *) getRanges:(NSArray *)objects delimeter: (NSObject *)object1 
{
    int rangeStart = -1;
    NSMutableArray *ranges = [[NSMutableArray alloc]init];
    int index;

    for (index=0; index<objects.count;index++) {
        if (objects[index] == object1) {
            if (rangeStart != -1) {
                Range *range = [[Range alloc] initWithRange:NSMakeRange(rangeStart,index-rangeStart)];
                [ranges addObject:range];
            }
            rangeStart = index;
        }
    }

    if (rangeStart != -1) {
        Range *range = [[Range alloc] initWithRange:NSMakeRange(rangeStart,index-rangeStart)];
        [ranges addObject:range];
    }
    return ranges;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...