Iphone 查找NSArray(或NSMutableArray)中的最大元素
我在NSArray附近航行时遇到了点麻烦 我的阵列: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中,这将是一个单独的调用,但
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,所以在这种情况下,它将测试相等的值。