Как я могу фильтровать и создавать диапазоны из NSIndexSet? - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть NSIndexSet, созданный

NSIndexSet* groups = [self.specifiers indexesOfObjectsPassingTest:^(PSSpecifier*specifier, NSUInteger idx, BOOL *stop) {
return [(NSString*)[specifier.properties objectForKey:@"cell"] isEqualToString:@"KBGroupCell"]; }];

это может выглядеть примерно так:

(0 3 5 8-9 12 14 17-19) и заданный максимум 25 *. 1006 *

Я надеюсь отфильтровать и создать диапазоны, чтобы получить результат, похожий на:

0-2

3-4

5-7

8-11

12-13

14-16

17-25

Используемый массив заполнен пользователями, а не мной. KBGroupCells используются для заполнения верхних и нижних колонтитулов в таблице, поэтому их не следует распознавать последовательно. Мне нужно помнить пропущенные числа (9, 18 и 19), когда я заполняю свою таблицу позже.

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

Может ли кто-нибудь помочь мне в достижении этого?

Спасибо заранее!

Ответы [ 2 ]

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

Я предполагаю, что у вас есть NSIndexSet:

    let original =   IndexSet(arrayLiteral: 0, 3, 5).union(IndexSet(integersIn: 8...9)).union( IndexSet.init(arrayLiteral: 12,14)).union(IndexSet(integersIn: 17...19)).union(IndexSet.init(arrayLiteral: 26,27))
    let nsIndex = original as! NSIndexSet

После преобразования его в IndexSet вы можете легко получить два массива.Одним из них является [NSRange], а другим - [closedRange]

    let index = nsIndex as! IndexSet
    let rangeView = index.rangeView
    print  ( Array(rangeView.enumerated().map{
      NSRange.init(location:($0.element.first!) , length: ((rangeView[$0.offset + 1].first!  - ($0.element.first!))))
    }.dropLast()))

    print  ( Array(rangeView.enumerated().map{
                ($0.element.first!)...(rangeView[$0.offset + 1].first!) - 1
        }.dropLast()))

Если это цель-C.Просто так:

NSMutableIndexSet * nsIndex =    [[NSMutableIndexSet alloc] init];
[nsIndex addIndex: 0];
[nsIndex addIndex: 3];
[nsIndex addIndex: 5];
[nsIndex addIndexesInRange:NSMakeRange(8, 2)];
[nsIndex addIndex: 12];
[nsIndex addIndex: 14];
[nsIndex addIndexesInRange:NSMakeRange(17, 3)];
[nsIndex addIndex: 26];
__block int count = 0;
__block NSMutableArray * ranges = [NSMutableArray array];
[nsIndex enumerateRangesUsingBlock:^(NSRange range, BOOL * _Nonnull stop) {
    count ++;
    [ranges addObject:[NSValue valueWithRange: range]];
}];
NSMutableArray * result  = [NSMutableArray array];
for (NSUInteger location = 0 ; location < count - 1 ; location++) {
    NSUInteger loc = ((NSValue *) ranges[location]).rangeValue.location;
    [result addObject:[NSValue valueWithRange: (NSMakeRange( loc,  ((NSValue *) ranges[location + 1]).rangeValue.location -  loc))]];
}
NSLog(result.description);

или с одним раундом:

__block NSUInteger temp = nsIndex.firstIndex;
__block NSMutableArray * result = [NSMutableArray array];
[nsIndex enumerateRangesWithOptions:NSEnumerationReverse usingBlock:^(NSRange range, BOOL * _Nonnull stop) {
    [result insertObject: [NSValue valueWithRange: NSMakeRange(range.location, temp - range.location)] atIndex:0];
    temp = range.location ;
}];
  result =  [result subarrayWithRange:NSMakeRange(0, result.count - 1)];
  NSLog(result.description);
0 голосов
/ 14 ноября 2018

Вот возможный алгоритм, кодирование и некоторые проверки ошибок оставлены в качестве упражнений!

cursor <- theSet first contained index
result <- empty array

while cursor <= maxIndex
   start <- cursor
   while cursor <= maxIndex and theSet contains cursor do increment cursor
   while cursor <= maxIndex and theSet does not contain cursor do increment cursor
   newRange <- start to cursor-1
   add newRange to result
end

return result

Этот алгоритм использует только два метода NSIndexSet - один для нахождения первого индекса в наборе идругой, чтобы проверить, есть ли индекс в наборе.Существуют методы «более высокого уровня», которые могут ускорить алгоритм, но с диапазоном 0-25 достаточно пройти по индексам.

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...