2012-03-08 1 views
-1

У меня есть Mutable Dictionary, из которого я удалил элемент с помощью removeObjectForKey. Это нормально, но когда я перечисляю словарь, есть «дыра» для элемента, который я удалил. Поэтому, когда я печатаю словарь, он отображает этот элемент как (null).Как удалить нулевые записи из NSMutableDictionary

Есть ли способ «упаковать» словарь после удаления элемента? Мне нужны смежные номера для ключей. Пример:

ПЕРЕД УДАЛИТЬ:

key:1 value:red 
key:2 value:green 
key:3 value:blue 
key:4 value:yellow 

myDictionary removeObjectForKey:2 

ТОК:

key:1 value:red 
key:3 value:blue 
key:4 value:yellow 

DESIRED:

key:1 value:red 
key:**2** value:blue 
key:**3** value:yellow 

код, чтобы удалить запись ноль из NSMutableDictionary. Это то, что я придумал, но он не работает:

int count = dictFaves.count; 
int x = 1; // Dictionaries are 1-relative 
while (x <= count) { 

    // get the current row 
    NSString *curRow = [NSString stringWithFormat:@"%d", x]; 
    NSString *temp = [dictFaves objectForKey:curRow]; 

    // is this row empty? if so, we have found our hole to plug 
    if (temp == nil) { 
     // copy the Fave from the 'next' row to the 'current' row. Effectively 
     // shifting it 1 lower in the Dictionary 
     NSString *nextRow = [NSString stringWithFormat:@"%d", x + 1]; 
     temp = [dictFaves objectForKey:nextRow]; 
     [dictFaves setObject:temp forKey:[NSNumber numberWithInt:x]]; 

     // one final thing to cleanup: remove the old 'next' row. 
     // It has been moved up 1 slot (along with all others) 
     [dictFaves removeObjectForKey:[NSString stringWithFormat:@"%d", x+1]]; 
    } 
    x = x + 1; 
} 

ответ

4

Это происходит потому, что NSDictionary (и его изменчивый подкласс) действует как хэш/карта/ассоциативный массив. Если вы хотите, чтобы индексы работали последовательно, вам необходимо либо сбросить их после удаления объекта, либо просто сохранить все в NSMutableArray.

+0

Боюсь, я слишком далеко от дизайна, чтобы перейти в NSMutableArray. Плохое планирование. Мне не нужны индексы для запуска последовательно - я был бы счастлив, если бы смог удалить отверстие в Словаре, созданном путем удаления записи. Я добавил код выше, чтобы сделать это, но он не работает ... – Bassman

+0

@Bassman: О какой дыре вы говорите? Я думал, что «дыра» - это способ сказать «цифры не последовательны». – Chuck

+0

Если вы не хотите использовать изменяемый массив, то вам нужно перебирать словарь и вручную устанавливать ключи в соответствии с вашими требованиями. – Alexander