2013-04-30 2 views
-1

Мои объекты массива следующим образом:Array - найти, сколько раз объект повторяется последовательно

10,10,10 
20,23,14 
10,10,10 
10,10,10 
10,10,10 
32,23,42 
32,23,42 
10,10,10 
32,23,23 
32,23,23 

Как я могу пройти через этот массив и выяснить, сколько раз тот же объект повторяется последовательно, а затем добавить, и количество повторений?

Затем сохраните новый массив с объектами, такими как:

10,10,10,1 
20,23,14,1 
10,10,10,3 
32,23,42,2 
10,10,10,1 
32,23,23,2 

Любая помощь будет оценена.

Спасибо!

+4

Почему первый и третий экземпляры '' 10,10,10' получить, 1 'еще второй экземпляр получает', 3'? Кроме того, являются ли эти объекты строками? –

+0

Потому что я только забочусь о последовательных повторениях. – objectiveccoder001

+0

Не суммарные вхождения объекта. – objectiveccoder001

ответ

0

Попробуйте это:

NSMutableArray *outArray = [[NSMutableArray alloc] init]; 
for (NSUInteger j = 0; j < [theArray count]; j++) { 
    id object = [theArray objectAtIndex:j]; 
    NSUInteger repeats = 1; 
    while (j + 1 < [theArray count] && [[theArray objectAtIndex:j + 1] isEqual:object]) { 
     j++; 
     repeats++; 
    } 
    [outArray addObject:object]; 
    [outArray addObject:[NSNumber numberWithUnsignedInteger:repeats]]; 
} 
return outArray; 

Это также может быть сделано на месте, если массив входных изменчиво. Я оставляю это как упражнение для читателя.

+0

Хотя это работает, ваше время выполнения равно O (J * N) (хотя N = 3 здесь, это может быть хуже) –

+0

O (J * N), где J - любая константа, все еще O (N). И любое решение, которое включает в себя проверку каждого элемента массива, будет не менее O (N). –

+0

Правильно, но хотя этот пример постоянный, кто-то, смотрящий на этот алгоритм, может применить его к переменной J –

0

Разбейте каждые три целых числа на свой собственный массив (убедитесь, что они являются строками).

Затем перебирает каждый из этих массивов, а также ввод в NSMutableDictionary, ключ строка (ваш номер), значение счетчика (если видело один раз, добавьте 1, и т.д. ...)

Держите указатель на наивысший ключ (если newCount> maximumCountPointer, а затем highCountPointer = newCount)

В конце этой итерации добавьте число, в котором наивысшие точки счёта попадают в конец массива.

+0

OP только хочет своего рода кодировку длины, а не список уникальных значений со счетами. –

0

Я не программист Objective C, поэтому, пожалуйста, прошу прощения за любые языки. Что-то вроде следующего должен делать эту работу:

NSMutableArray *result = [[NSMutableArray alloc] init]; 
id pending = nil; 
NSUInteger count = 0; 
for (NSUInteger i = 0; i < [theArray count]; i++) { 
    id object = [theArray objectAtIndex:i]; 
    if ([object isEqual:pending]) { 
     count++; 
    } else { 
     if (pending != nil) { 
      [result addObject:[NSString stringWithFormat:@"%@,%d", pending, count]]; 
     } 
     pending = object; 
     count = 1; 
    } 
} 
if (pending != nil) { 
    [result addObject:[NSString stringWithFormat:@"%@,%d", pending, count]]; 
} 
0

Просто запустите «уник -c» из командной строки :)

+0

OP не ищет уникальных счетчиков, просто своего рода кодировку длины. –

+0

Переформатирование результата «uniq -c» даст вам «кодировку длины пробега» (СОВЕТ: используйте sed или tr) – ElKamina

Смежные вопросы