Как удалить ноль записей из NSMutableDictionary - PullRequest
0 голосов
/ 09 марта 2012

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

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

ДО УДАЛЕНИЯ:

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

myDictionary removeObjectForKey:2

CURRENT:

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

1 Ответ

4 голосов
/ 09 марта 2012

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

...