查找NSArray(或NSMutableArray)中的最大元素

时间:2010-12-20 03:52:58

标签: iphone objective-c ios4

我在导航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 个答案:

答案 0 :(得分:8)

我是这样做的:

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,它还会记住其元素添加到数组的次数。

答案 1 :(得分:3)

只为你写这个:)

- (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;
}

编辑:虽然我的解决方案有效,但你应该赞成/接受@Dave DeLong的回答,这要好得多。

答案 2 :(得分:0)

你不能只使用:

[myarray length] /2