NSMutableDictionary не устанавливает значение для ключа

У меня есть код, в котором существующие даты дескриптора в массиве, отделяют день месяца и помещаются в NSMutableDictionary с соответствующим днем ​​месяца, массив имеет следующую структуру:

"12/01/2014" //Structure of my date is -> dd-mm-yyyy
"16/01/2014"
"30/01/2014"
"02/02/2014"
"08/02/2014"

Я использую этот код, чтобы поместить эти значения в NSMutableDictionary:

dictionary = [NSMutableDictionary dictionary];
for(int x=0;x<[list count];x++){

        NSMutableArray *lstaInfo2 = [[list[x] componentsSeparatedByString:@"/"] mutableCopy];

        if([lstaInfo2[1]  isEqual: @"01"]){

            [dictionary setValue:list[x] forKey:[NSString stringWithFormat:@"January of %@",lstaInfo2[2]]];

        }
        if([lstaInfo2[1]  isEqual: @"02"]){

            [dictionary setValue:list[x] forKey:[NSString stringWithFormat:@"February of %@",lstaInfo2[2]]];
        }

}

Значения, которые я надеялся вернуть в словаре переменных:

January of 2014 =>

"12/01/2014"
"16/01/2014"
"30/01/2014"

February of 2014 =>

"02/02/2014"
"08/02/2014"

Но словарь переменных возвращает только последние значения, например:

January of 2014 =>

    "30/01/2014"

February of 2014 =>

    "08/02/2014"

Зачем? Как я могу решить эту проблему?


person user3781174    schedule 03.08.2014    source источник
comment
Словарь будет содержать только одну запись для каждого уникального значения ключа. Если вы хотите больше, вам нужно вставить массив значений.   -  person Hot Licks    schedule 03.08.2014


Ответы (3)


dictionary = [NSMutableDictionary dictionary];
for(int x=0;x<[list count];x++){

    NSString* key = [self getKeyForDate:list[x]];
    NSMutableArray* listForMonth = dictionary[key];
    if (key == nil) {
        listForMonth = [NSMutableArray array];
        [dictionary setValue:listForMonth forKey:key];
    }
    [listForMonth addObject:list[x]];
}

.....

In init

monthArray = @[@"January", @"February", @"March" ...

Отдельный метод:

-(NSString*) getKeyForDate:(NSString*)date {
    NSMutableArray *lstaInfo2 = [date componentsSeparatedByString:@"/"] mutableCopy];
    NSInteger monthNum = lstaInfo2[0].integerValue;
    NSString* result = [NSString stringWithFormat;@"%@ of %@", monthArray[monthNum-1], lstaInfo2[2]]; 
    return result;
}

Вы также можете использовать NSDateFormatter для анализа даты и NSCalendar для отображения названий месяцев, но это слишком глубоко для одного урока.

person Hot Licks    schedule 03.08.2014
comment
Спасибо и вам, просто кодируйте и тоже работает, спасибо +1 за вас! - person user3781174; 03.08.2014

Когда вы пытаетесь добавить новое значение в словарь, проверьте, действительно ли значение для этого ключа находится в словаре. Если нет, создайте и установите объект NSMutableArray для этого ключа и добавьте значения в этот массив.

Попробуй это:

```объект

dictionary = [NSMutableDictionary dictionary];
for(int x=0; x < [list count]; x++){

    NSArray *lstaInfo2 = [list[x] componentsSeparatedByString:@"/"];
    NSString *key;

    if([lstaInfo2[1]  isEqual: @"01"]){
        key = [NSString stringWithFormat:@"January of %@",lstaInfo2[2]];

    }
    if([lstaInfo2[1]  isEqual: @"02"]){
        key = [NSString stringWithFormat:@"February of   %@",lstaInfo2[2]];
    }
    if (key) { 
        //if there is no value for the specified key create and set 
        //NSMutableArray object for this key, otherwise keep value for
        //the key without modyfing it.
        dictionary[key] = dictionary[key] ?: [NSMutableArray array]; 
        [dictionary[key] addObject:list[x]];
    }

} ```

person Rafał Augustyniak    schedule 03.08.2014

Это потому, что setValue:forKey: не добавляется к текущему значению. Таким образом, в первой итерации цикла вы устанавливаете "January of 2014" => ["12", "01", "2014"], а в следующей итерации вы устанавливаете "January of 2014" => ["16", "01", "2014"] и так далее. Вы хотите сопоставить строку с NSMutableArray.

Я бы посоветовал вам использовать для этого класс NSDateFormatter: https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/classes/nsdateformatter_class/Reference/Reference.html#//apple_ref/occ/instm/NSDateFormatter/. Это будет проще и намного гибче, чем вручную разбирать даты.

person andrewlamb    schedule 03.08.2014