Алгоритм: ведение подсчета пары ключ / значение в NSDictionary - PullRequest
1 голос
/ 21 ноября 2008

Будучи новичком в Какао и, возможно, не зная всех потенциальных классов, которые уже имеют эту функциональность, аккуратно обернутую в класс OO, вот запрос алгоритма. Какой лучший способ посчитать, сколько раз конкретный ключ встречается в массиве из нескольких NSDictionary экземпляров?

По сути, моя структура данных (в данном случае NSArray) может содержать несколько NSDictionary экземпляров в любой момент времени, каждый из которых имеет одинаковые ключи, потенциально разные значения. Некоторые значения повторяются. Я хотел бы знать, сколько раз появляется конкретный ключ / значение. Пример:

{
  foo => 1,
  bar => 2
}
{
  foo => 1,
  bar => 3
}
{
  foo => 2,
  bar => 1
}

В этом случае мне интересно, что foo=>1 происходило 2 раза и foo=>2 происходило 1 раз. Является ли создание экземпляра NSCountedSet лучшим способом для этого? Возможно связанный список C?

Ответы [ 3 ]

4 голосов
/ 21 ноября 2008

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

2 голосов
/ 21 ноября 2008
NSDictionary * dict1 = [[NSDictionary alloc] initWithObjectsAndKeys:
                        [NSNumber numberWithInt:1], @"foo",
                        [NSNumber numberWithInt:2], @"bar", nil];
NSDictionary * dict2 = [[NSDictionary alloc] initWithObjectsAndKeys:
                        [NSNumber numberWithInt:1], @"foo",
                        [NSNumber numberWithInt:3], @"bar", nil];
NSDictionary * dict3 = [[NSDictionary alloc] initWithObjectsAndKeys:
                        [NSNumber numberWithInt:2], @"foo",
                        [NSNumber numberWithInt:1], @"bar", nil];
NSArray * arrayOfDictionaries = [[NSArray alloc] initWithObjects:
                                 dict1, dict2, dict3, nil];

// count all keys in an array of dictionaries (arrayOfDictionaries):

NSMutableDictionary * countKeys = [[NSMutableDictionary alloc] initWithCapacity:0];
NSCountedSet * counts = [[NSCountedSet alloc] initWithCapacity:0];

NSArray * keys;
NSString * pairString;
NSString * countKey;
for (NSDictionary * dictionary in arrayOfDictionaries)
{
    keys = [dictionary allKeys];
    for (NSString * key in keys)
    {
        pairString = [NSString stringWithFormat:@"%@->%@", key, [dictionary valueForKey:key]];
        if ([countKeys valueForKey:pairString] == nil)
        {
            [countKeys setValue:[NSString stringWithString:pairString] forKey:pairString];
        }
        countKey = [countKeys valueForKey:pairString];
        { [counts addObject:countKey]; }
    }
}

NSLog(@"%@", counts);

[counts release];
[countKeys release];

[arrayOfDictionaries release];
[dict1 release];
[dict2 release];
[dict3 release];
1 голос
/ 21 ноября 2008
NSCountedSet *keyCounts = [NSCountedSet set];
for (NSDictionary *dict in myDictionaries)
    [keyCounts unionSet:[NSSet setWithArray:[dict allKeys]]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...