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

Iphone 查找NSArray(或NSMutableArray)中的最大元素,iphone,objective-c,ios4,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中,这将是一个单独的调用,但

我在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中找不到等效的调用

非常感谢,, Brett你就不能用:

[myarray length] /2
你就不能用:

[myarray length] /2

这是为你写的:

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

编辑:虽然我的解决方案有效,但您应该更新投票/接受的答案,这要好得多。

为您写了以下内容:

- (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;
}
编辑:虽然我的解决方案有效,但您应该更新投票/接受的答案,它要好得多。

以下是我的解决方案:

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

以下是我的操作方法:

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,它还记得它的元素被添加到数组中的次数。

这将给出元素数除以2的结果。我要寻找的是一个方法,它向我显示最常出现的元素的值。在这个例子中,值应该是ElementA。对不起-我的意思是-你对数组进行排序,然后再进行排序。这种技术听起来很简单。这将给出元素数除以2的结果。我要寻找的是一个方法,它向我显示最常出现的元素的值。在这个例子中,值应该是ElementA。对不起-我的意思是-你先对数组排序,然后再进行排序。这种技术听起来很简单。哇…真是太棒了!棒极了,比我预想的要简单得多。非常感谢。哇……真是太好了!棒极了,比我预想的要简单得多。非常感谢,这不是中位数。中位数是平均数的同义词。你要找的是模式,不是中位数。中位数是平均数的同义词。你要找的是模式。@Dave我知道有类似的东西,但我找不到!很好+1这将适用于任何对象,而不仅仅是NSString。太棒了。是的,NSCountedSet是一种几乎没有用处的隐藏小宝石,但当你需要它时,它是完美的hi它将对实际对象或具有相同值的对象的重复计数进行计数?????@pawan.mangal对象被视为相等,如果[obj1 isEqual:obj2]返回YES,这就是NSSet和friends正在使用的。NSObject上的默认实现只是进行指针比较,因此正在测试实际对象。然而,NSString重写它确实更像strcmp,所以在这种情况下它将测试相等的值。@Dave我知道有类似的东西,但我找不到它!很好+1这将适用于任何对象,而不仅仅是NSString。太棒了。是的,NSCountedSet是一种几乎没有用处的隐藏小宝石,但当你需要它时,它是完美的hi它将对实际对象或具有相同值的对象的重复计数进行计数?????@pawan.mangal对象被视为相等,如果[obj1 isEqual:obj2]返回YES,这就是NSSet和friends正在使用的。NSObject上的默认实现只是进行指针比较,因此正在测试实际对象。然而,NSString重写它确实更像strcmp,所以在这种情况下,它将测试相等的值。