如何比较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" )
- 如何检测UITextField的点击?
- 哪个PHAssetCollection用于保存图像?
- 将C转换为Swift:将放大镜图标添加到UITextField
- 是否有可能以编程方式从Swift / Objective-C中的UIViewController或Storyboard获取基本UIViewController的标识符?
- UITableViewdynamic添加单元格
- 无法将MapKit用户坐标转换为屏幕坐标
- searchResultsTableView显示两个相同的单元格
- 无法确定coreData代码生成的生成文件path
- UIImagePickerControllerCameraDeviceFront只能在其他时间工作