Нахождение максимальных элементов в NSArray (или NSMutableArray) - PullRequest
1 голос
/ 20 декабря 2010

У меня возникли некоторые проблемы при навигации по NSArray.

Моему массиву:

Element[0] = "ElementA"
Element[1] = "ElementA"
Element[2] = "ElementA"
Element[3] = "ElementA"
Element[4] = "ElementB"
Element[5] = "ElementC"

Существуют ли какие-либо методы в Objective-C, которые помогут мне найти "Срединный "элемент?В этом случае "медиана" будет "ElementA", или значение, которое встречается максимальное количество раз.

В C # это будет один вызов, но я не могу найти эквивалент в Objective-C.

Большое спасибо, Бретт

Ответы [ 3 ]

8 голосов
/ 20 декабря 2010

Вот как я это сделаю:

NSArray * elements = ...; //your array of elements:
NSCountedSet * counts = [NSCountedSet setWithArray:elements]:
id modeObject = nil;
NSUInteger modeCount = 0;
for (id element in counts) {
  if ([counts countForObject:element] > modeCount) {
    modeCount = [counts countForObject:element];
    modeObject = element;
  }
}

NSLog(@"element with highest frequency: %@", modeObject);

NSCountedSet - это NSMutableSet, который также запоминает, сколько раз его элементы были добавлены в массив.

3 голосов
/ 20 декабря 2010

Написал это только для вас:)

- (NSString *) findModeString: (NSArray *) array {
   NSMutableDictionary *stats = [[NSMutableDictionary alloc] init];
   for(NSString *str in array) {
      if(![stats objectForKey:str]) {
         [stats setObject: [NSNumber numberWithInt:1] forKey:str];
      } else {
         [stats setObject: [NSNumber numberWithInt:[[stats objectForKey:str] intValue] + 1] forKey:str];
      }
   }
   NSInteger maxOccurrences = 0;
   NSString *max;
   for(NSString *key in stats) {
      if([[stats objectForKey:key] intValue] > maxOccurrences) {
         max = key;
         maxOccurrences = [[stats objectForKey:key] intValue];
      }
   }
   [stats release];
   return max;
}

РЕДАКТИРОВАТЬ : Хотя мое решение работает, вы должны подтвердить / принять @ Дейв Делонг ответ, оно намного лучше.

0 голосов
/ 20 декабря 2010

Не могли бы вы просто использовать:

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