Comment comparer les éléments de NSArray dans NSMutableDictionary?

Mon NSMutableDictionary contient quatre NSArray avec leurs keys respectives. Ces NSArray sont de taille 2 et contiennent des coordonnées 2D. Je veux get la coordonnée la plus commune parmi eux. Par exemple, si une coordonnée est commune à trois arrays, ce serait mon premier choix. Comment puis-je find qu'une coordonnée est commune à au less deux arrays?

Fondamentalement, vous voulez find la paire de coordonnées qui a le maximum d'occurrences. Vous pouvez donc créer un tableau de toutes les coordonnées et find son mode.

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

Maintenant, U besoin d'écrire une méthode personnalisée pour find le mode d'un tableau de coordonnées (avec une condition supplémentaire de fréquence étant> = 3).

Ceci est un exemple de travail. Je suppose que votre dictionary ressemble à 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 } } 

Voici un code qui devrait fonctionner, en utilisant NSCountedSet .
En quelques mots: j'utilise un NSCountedSet qui fonctionnera comme un NSSet gardant aussi le nombre d'occurrences (duplicates fois).
Ensuite, je crée un NSArray sortingant les valeurs décroissant en fonction du nombre d'occurrences.
J'ai écrit explicitement la comparaison "count1 / count2" dans le cas où vous voulez appliquer une valeur différente si le nombre d'occurrences est le même.

 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); 

Les sorties sont:

 > 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" )