2010-10-15 60 views
3

我有一個可能包含超過二十個對象的NSMutableDictionary。 如果它包含超過20個對象,我應該如何刪除最舊的條目直到剩下20個對象?在NSMutableDictionary中刪除索引20後的所有對象?

例如,用的NSMutableDictionary對象:

a = "-1640531535"; 
b = 1013904226; 
c = "-626627309"; 
d = 2027808452; 
e = 387276917; 
f = "-1253254618"; 
g = 1401181143; 
h = "-239350392"; 
i = "-1879881927"; 

隨着對象的最大數量:5,應該成爲:

a = "-1640531535"; 
b = 1013904226; 
c = "-626627309"; 
d = 2027808452; 
e = 387276917; 

謝謝。

+0

你看過NSCache嗎? (http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/NSCache_Class/Reference/Reference.html)它是iOS 4+,實現起來更復雜一點,但它有一個countLimit屬性,它會(通常)保持集合低於一定的大小。 – 2010-10-16 03:57:13

回答

1

如果你正在尋找的是20元,我想嘗試這樣的:

NSMutableDictionary* newDict = [NSMutableDictionary new]; 
int     count = 0; 

for (id theKey in oldDict) 
{ 
    [newDict setObject:[oldDict getObjectForKey:theKey] forKey:theKey]; 

    if (++count == 20) 
     break; 
} 

[oldDict release]; 
oldDict = newDict; 

這個想法是,你將你找到的前20個鍵的元素複製到一個新的字典中,然後用新的字典替換舊的。如果你想通過其他方式迭代字典,你也可以這樣做,但上面的代碼不會有太大的改變。

+0

似乎是一個好主意,我會嘗試。 – Emil 2010-10-16 09:03:15

+0

順便說一下,'++ count'是做什麼的? – Emil 2010-10-16 09:05:11

+2

它在引用count之前將'count'加1,btw'count ++'在引用之後增加'count' – knuku 2010-10-16 11:43:17

1

如果密鑰NSNumbers,你知道他們是連續的,而且要刪除的較低值,則:

int limit=20; //set to whatever you want 
int excess = limit - [dict count]; 
if (excess > 0) { 
    for (int i = 1; i <= excess; i++) { 
    [dict removeObjectForKey:[NSNumber numberWithInt:i]]; 
    } 
} 

如果你的鑰匙是NSString的然後就用對應的格式創建的NSString。

如果您的密鑰不是順序的,那麼您將不得不爲每個條目設置一個帶有存儲日期的並行字典,這樣您就可以知道每個條目何時存儲並且可以刪除最舊的條目,或者您需要使用完全是另一回事(如果你存儲連續整數鑰匙,那豈不是更容易使用的NSMutableArray?)

+0

最初的問題有點誤導,它根本不包含數字。它包含NSStrings。 – Emil 2010-10-16 09:02:40

+0

然後用[NSString stringWithFormat:「%d」,i]替換NSNumber – Chochos 2010-10-16 13:33:47

相關問題