2014-10-25 4 views
-1

У меня есть массив как это:Обнаружение нескольких объектов в NSArray

NSArray *array = [NSArray arrayWithObjects:@"3", @"7", @"7", @"7", @"6", @"6", @"2", @"2", @"2", nil];  

И я хочу, чтобы удалить @"7", @"7", @"7" и @"2", @"2", @"2". Поэтому я хочу удалить объекты, только если они повторяются три раза без какого-либо другого объекта.

Есть ли способ сделать это в Objective-C?

+0

возможно дубликат [? Лучший способ удалить повторяющиеся значения из NSMutableArray в Objective-C] (http://stackoverflow.com/questions/1025674/ a-best-way-to-remove-duplicate-values-from-nsmutablearray-in-objective-c) – Zakaria

+0

Да, этот вопрос будет * обычно * быть дубликатом, но его запрос очень специфичен: как удалить значение, которое последовательно повторяется три раза в NSArray. Итак, ** НЕТ **, это не дублирующий вопрос. Однако этот вопрос нуждается в более подробной информации: интересно, что ожидает @ user3553919, если в arary есть два или четыре последовательных значения? –

+0

Удаление последовательных повторов тривиально и не заслуживает вопроса SO. –

ответ

0

Попробуйте этот вариант. Я включил параметр, чтобы вы могли фильтровать любое количество повторов. Существует множество возможностей для оптимизации, но для большинства случаев она должна быть достаточно быстрой.

-(NSArray *)filterArray:(NSArray *)array forRepeats:(NSUInteger)repeats { 
    if ((NSInteger)repeats < 2) { 
     return array; 
    } 
    NSMutableArray *filteredArray = [NSMutableArray arrayWithArray:array]; 
    BOOL remove; 
    for (int i = 0; i <= filteredArray.count - repeats; i++) { 
     remove = YES; 
     for (int j = 1; j < repeats; j++) { 
      NSString *str1 = [filteredArray objectAtIndex:i+j-1]; 
      NSString *str2 = [filteredArray objectAtIndex:i+j]; 
      if (![str1 isEqualToString:str2]) { 
       remove = NO; 
       break; 
      } 
     } 
     if (remove) { 
      for (int j = 0; j < repeats; j++) { 
       [filteredArray removeObjectAtIndex:i]; 
      } 
      --i; 
     } 
    } 
    return filteredArray; 
} 

Так что для вашего случая:

NSArray *array = [NSArray arrayWithObjects:@"3", @"7", @"7", @"7", @"6", @"6", @"2", @"2", @"2", nil]; 
NSArray *filteredArray = [self filterArray:array forRepeats:3]; 
Смежные вопросы