NSMutableDictionary tidak menetapkan nilai untuk kunci

Saya memiliki kode di mana tanggal pegangan yang ada dalam sebuah array, memisahkan hari dalam sebulan dan akan dimasukkan ke dalam NSMutableDictionary dengan hari masing-masing dalam sebulan, array tersebut memiliki struktur berikut:

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

Saya menggunakan kode ini untuk memasukkan nilai-nilai ini ke dalam 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]]];
        }

}

Nilai yang saya harapkan untuk dikembalikan dalam kamus variabel adalah:

January of 2014 =>

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

February of 2014 =>

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

Namun kamus variabel hanya mengembalikan nilai terakhir, seperti ini:

January of 2014 =>

    "30/01/2014"

February of 2014 =>

    "08/02/2014"

Mengapa? Bagaimana cara mengatasi masalah ini?


person user3781174    schedule 03.08.2014    source sumber
comment
Kamus hanya akan menampung satu entri per nilai kunci unik. Jika Anda menginginkan lebih, Anda perlu memasukkan serangkaian nilai.   -  person Hot Licks    schedule 03.08.2014


Jawaban (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" ...

Metode terpisah:

-(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;
}

Anda juga dapat menggunakan NSDateFormatter untuk mengurai tanggal, dan NSCalendar untuk menyajikan nama bulan, tapi itu terlalu mendalam untuk satu pelajaran.

person Hot Licks    schedule 03.08.2014
comment
Terima kasih untuk Anda juga, cukup kode dan berfungsi dengan baik, terima kasih +1 untuk Anda! - person user3781174; 03.08.2014

Saat Anda mencoba menambahkan nilai baru ke kamus, periksa apakah nilai untuk kunci ini benar-benar ada di kamus. Jika tidak, buat dan setel objek NSMutableArray untuk kunci ini dan tambahkan nilai ke array ini.

Coba ini:

``` keberatan

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

Itu karena setValue:forKey: tidak ditambahkan ke nilai saat ini. Jadi pada iterasi pertama melalui loop Anda menyetel "January of 2014" => ["12", "01", "2014"] dan pada iterasi berikutnya Anda menyetel "January of 2014" => ["16", "01", "2014"], dan seterusnya. Anda ingin memetakan dari string ke NSMutableArray.

Saya sangat menyarankan Anda menggunakan kelas NSDateFormatter untuk ini: https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/classes/nsdateformatter_class/Reference/Reference.html#//apple_ref/occ/instm/NSDateFormatter/. Ini akan lebih mudah dan lebih fleksibel daripada menguraikan tanggal secara manual.

person andrewlamb    schedule 03.08.2014