2015-03-17 9 views
1

Мой NSMutableDictionary содержит четыре NSArray с соответствующими ключами. Эти NSArray s имеют размер 2 и содержат 2D-координаты. Я хочу получить среди них самую общую координату. Например, если координата является общей для трех массивов, это будет мой первый выбор. Как я могу найти, что любая координата является общей для по крайней мере двух массивов?Как сравнить элементы NSArray в NSMutableDictionary?

+0

Имеет ли каждый NSArray две 2D-координаты или элементы 'double', представляющие широту и долготу? – Dennis

+0

Возможно, вас заинтересует 'NSCountedSet'. – Larme

+0

@Dennis Каждый NSArray содержит одну двумерную координату (X, Y) любой точки. Мне нужно выбрать наиболее благоприятную координацию среди четырех из них. Если какая-либо из координат будет распространена в двух или трех массивах, это будет мой благоприятный вариант, если не тогда, мне придется сканировать новые наборы данных. – Raja

ответ

2

В основном вы хотите, чтобы найти пару координат, которая имеет максимум вхождений. Итак, вы можете создать массив всех координат и найти его режим.

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

0

Это рабочий пример. Я предполагаю, что ваш словарь выглядит как 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 
    } 
} 
0

Вот код, который должен работать, используя NSCountedSet.
В нескольких словах: Я использую NSCountedSet, который будет работать как NSSet, сохраняя также числа вхождений (дубликатов раз).
Затем я создаю 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" 
) 
Смежные вопросы