Я хотел бы провести некоторые вычисления и сравнения внутри своего массива

Предполагая, что мой массив прост как:

NSMutableArray *array;   
array = [[NSMutableArray alloc] init]; 
[array addObject:[NSNumber numberWithInt:1]]; 
[array addObject:[NSNumber numberWithInt:2]]; 
[array addObject:[NSNumber numberWithInt:2]]; 
[array addObject:[NSNumber numberWithInt:3]]; 
[array addObject:[NSNumber numberWithInt:2]]; 

Каким будет элегантный и умный способ проверить, повторяется ли число 2, 3, 4 или 5 раз внутри этого массива? (ищу что-то умное и динамичное ....)

2
chewy 29 Авг 2011 в 19:45

3 ответа

Лучший ответ

Вам не нужно перебирать вещи самостоятельно, если вы просто хотите знать, сколько раз появляется каждый объект. Это действительно просто:

NSMutableArray *array;   
array = [[NSMutableArray alloc] init]; 
[array addObject:[NSNumber numberWithInt:1]]; 
[array addObject:[NSNumber numberWithInt:2]]; 
[array addObject:[NSNumber numberWithInt:2]]; 
[array addObject:[NSNumber numberWithInt:3]]; 
[array addObject:[NSNumber numberWithInt:2]]; 

NSCountedSet *counts = [[NSCountedSet alloc] initWithArray:array]

NSLog(@"%d", [counts countForObject:[NSNumber numberWithInt:2]]); // logs 3

[array release];
[counts release];
3
Dave DeLong 29 Авг 2011 в 17:08

Если числа находятся только в диапазоне от 0 до 10, тогда у вас должен быть массив из 11 элементов с именем counts. Элемент i th в массиве - это количество раз, когда i появляется в исходном массиве. Заполнить массив count просто: один цикл через ваш исходный массив (a) на каждой итерации приращения counts[a[i]].

Число i повторяется counts[i] раз. Нет if :)

5
Armen Tsirunyan 29 Авг 2011 в 16:00

Не уверен, что это кажется вам элегантным, но вы всегда можете создать подкласс NSMutableArray, чтобы добавить код, который подсчитывает вхождения определенных чисел по мере их добавления / удаления. В документации для NSMutableArray говорится, что редко есть веская причина для его подкласса, но в ней приводятся примеры того, когда это может иметь смысл, в том числе этот:

Получение дополнительной информации о том, что происходит с коллекцией (например, сбор статистики).

Я бы рассмотрел то, что вы делаете, как форму сбора статистики, не так ли?

1
Tim Dean 29 Авг 2011 в 16:01