Количество строк Dynamica в NSMutableArray в NSMutableDictionary

Я знаком с получением количества строк из известного массива

    int numberOfWords = [self.wordArray count]; 

но у меня есть неизвестное количество строк в неизвестном количестве массивов, на все из которых ссылается словарь. Это работает - хорошо.

   NSMutableDictionary *eqClasses = [[NSMutableDictionary alloc] init];

Массивы и строки добавляются во время выполнения (с помощью этой платы):

            NSMutableArray* array = [eqClasses objectForKey:wordPattern];
            if(!array) {
                // create new array and add to dictionary if wordPattern not found
                array = [NSMutableArray array];
                [eqClasses setObject:array forKey:wordPattern];
            }
            [array addObject:tempWordStr];

Теперь мне нужно перебрать словарь и получить массив с наибольшим количеством слов. Есть ли способ прокрутить все массивы в словаре без использования ключа (я не буду знать все шаблоны слов, поскольку они генерируются динамически), И как только я найду массив с наибольшим количеством слов, получить этот массив/значение и ключ/слово?


person user1278974    schedule 18.04.2012    source источник


Ответы (3)


Ну, есть способ получить все ключи в словаре:

NSArray *keyArray = [myDict allKeys];

А затем вы просто проходите по массиву и получаете объект для каждого ключа. Быстрое перечисление должно работать хорошо.

for (NSString *string in NSArray){
    ...
} //Assuming your keys are strings!

Вы можете сохранить каждую строку во временную строку и, встретив новую строку, сравнить ее, чтобы найти более длинную. Если она длиннее, замените старую строку на более длинную.

Надеюсь, это помогло! ^_^

person waylonion    schedule 18.04.2012
comment
allKeys действительно возвращает то, что мне нужно - спасибо. Но я новичок в Objective C, поэтому у меня проблемы со следующей частью, которую вы описываете. Мне нужно использовать ключи, чтобы пройтись по словарю, описанному выше. Вы, вероятно, объяснили, но немного больше фрагментов было бы признательно. - person user1278974; 18.04.2012
comment
Это плохой синтаксис, но что-то вроде того, что я пытаюсь использовать в сочетании с приведенным выше примером кода: int numberOfWords = [eqClasses objectForKey:string count]; - person user1278974; 18.04.2012
comment
Посмотрите, имеет ли смысл мой второй ответ :) - person waylonion; 18.04.2012

^_^ Итак, теперь, когда у вас есть массив, полный всех ключей в словаре, вы можете перебрать весь массив и получить соответствующее значение (строку) для каждого ключа.

NSArray *keyArray = [myDict allKeys]; //This gets all the keys
NSString *tempString = @""; //This is the string you will save the longest string in. It gets updated when a longer string is found in the following loop.

for (NSString *string in keyArray){
    NSString *stringFromCurrentKey = [myDict objectForKey:string];
    if(stringFromCurrentKey.length > tempString.length){
        tempString = stringFromCurrentKey;
    }
} //By the end, you should be left with the longest string contained in tempString!

^_^ Надеюсь, это имело смысл и помогло!

person waylonion    schedule 18.04.2012

Попробуйте этот код:

NSArray *largestArray = nil;

for (NSString *key in dictionary)
{
    NSArray *array = [dictionary objectForKey:key];
    if (array.count > largestArray.count) // largestArray.count is 0 if largestArray is nil
    {
        largestArray = array;
    }
}
person Christian Schnorr    schedule 18.04.2012
comment
Изменить: исправлен тот факт, что NSDictionary возвращает ключи во время быстрого перечисления. - person Christian Schnorr; 18.04.2012