如何比较NSMutableDictionary中NSArray的元素?

我的NSMutableDictionary包含四个NSArray和它们各自的键。 这些NSArray的大小是2,包含二维坐标。 我想要得到他们之间最常见的协调。 例如,如果一个坐标是三个数组共同的,那么这将是我的第一select。 我怎么能发现至less有两个数组的坐标是共同的?

基本上你想find有最大发生的坐标对。 所以你可以创build一个所有坐标的数组并find它的模式。

  NSMutableArray *allCoordinates = [NSMutableArray new]; [dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { if ([key isEqualToString:@"arrayKey1"] || [key isEqualToString:@"arrayKey2"]) { NSArray *coordinates = (NSArray *)obj; [coordinates enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { [allCoordinates addObject:coordinates]; }]; } }]; 

现在,U需要编写一个自定义方法来查找坐标数组的模式(具有> = 3的附加条件)。

这是一个工作的例子。 我假设你的字典看起来像coordinatesDict

 NSDictionary *coordinatesDict = @{@"first": @[@11.58, @40.20], @"second": @[@12.12, @100.12], @"third": @[@11.58, @40.20], @"fourth": @[@13.2, @14.5]}; NSCountedSet *coordinates = [NSCountedSet setWithArray:[coordinatesDict allValues]]; for (NSArray *coordinateArray in coordinates) { NSUInteger coordinateCount = [coordinates countForObject:coordinateArray]; NSLog(@"Array %@ is included %lu times", coordinateArray, (unsigned long)coordinateCount); if (coordinateCount >= 2) { // You found your best coordinate } } 

这是一些应该使用NSCountedSet代码。
简而言之:我使用一个NSCountedSet ,它将作为一个NSSet保存事件的数量(重复次数)。
然后,我创build一个NSArray按照出现次数降序排列值。
我明确写了“count1 / count2”比较的情况下,如果你想应用一个不同的值,如果出现次数相同。

 NSDictionary *allData = @{@"Key1: %@":@[@(0.0), @(0.1)], @"Key2: %@":@[@(0.1), @(0.1)], @"Key3: %@":@[@(0.2), @(0.1)], @"Key4: %@":@[@(0.1), @(0.1)]}; NSCountedSet *countedSet = [[NSCountedSet alloc] initWithArray:[allData allValues]]; for (NSArray *array in countedSet) NSLog(@"For %@ counted %@ time(s)", array, @([countedSet countForObject:array])); NSArray *sortedCountedSetArray = [[countedSet allObjects] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { NSUInteger count1 = [countedSet countForObject:obj1]; NSUInteger count2 = [countedSet countForObject:obj2]; if (count1 < count2) return NSOrderedDescending; if (count1 > count2) return NSOrderedAscending; else return NSOrderedSame; //May want to do additionaly thing (for example if coordinate is closer to actual position, etc.) }]; NSLog(@"sortedCountedSetArray: %@", sortedCountedSetArray); NSArray *bestOption = [sortedCountedSetArray firstObject]; //Coordinates the most "popular" NSLog(@"BestOption: %@", bestOption); 

输出是:

 > For ( "0.1", "0.1" ) counted 2 time(s) > For ( "0.2", "0.1" ) counted 1 time(s) > For ( 0, "0.1" ) counted 1 time(s) > sortedCountedSetArray: ( ( "0.1", "0.1" ), ( "0.2", "0.1" ), ( 0, "0.1" ) ) > BestOption: ( "0.1", "0.1" )