2013-02-02 35 views
1

我正在嘗試創建一個唯一鍵的NSDictionary,每個值都是唯一鍵的計數。NSDictionary計數鍵數

鑑於陣列[apple, apple, banana, apple, pear, banana]我能得到字典...

{ 
    apple : 3, 
    banana : 2, 
    pear : 1 
} 

我敢肯定,我已經看到代碼之前,你可以這樣做......

NSMutableArray *uniqueKeys = [NSMutableArray array]; 

for (NSString *string in myArray) { 
    uniqueKeys[string]++; 
} 

但我不記得確切的語法是什麼。

我知道我可以通過提取NSNumber並改變它並將其放回去,但我希望在可能的情況下使用此方法。

回答

5

似乎你可能能夠使用NSCountedSet。 如果「蘋果」和「蘋果」相同,則可以知道計數集中有多少「水果」,以及該集合中有多少「蘋果」。

蘋果的文檔:

的NSCountedSet類聲明的編程接口,以模糊的對象 可變的,無序的集合。一個計數的集合是 也被稱爲一個袋子。

插入到NSCountedSet對象中的每個不同對象都有一個與其關聯的 計數器。 NSCountedSetkeeps追蹤對象被插入的次數 ,並且要求相同次數的對象被刪除 。因此,即使該對象已被添加到設置的倍數 次,在NSSet對象中只有一個對象實例在 中。由超類NSSet定義的計數方法具有特殊的重要性 ;它將返回不同對象的數量,而不是該對象在該集合中表示的總次數的 。 NSSet和NSMutableSet類分別爲其元素不同的靜態和動態集合 (分別)提供。

更新

下面是一個例子:

NSCountedSet * fruits = [[NSCountedSet alloc] initWithArray:@[@"apple", @"apple", @"banana", @"apple", @"pear", @"banana"]]; 
NSLog(@"fruit count = %d", [fruits count]); 
NSLog(@"num apples = %d", [fruits countForObject:@"apple"]); 
NSLog(@"num bananas = %d", [fruits countForObject:@"banana"]); 
NSLog(@"num pears = %d", [fruits countForObject:@"pear"]); 
NSLog(@"num oranges = %d", [fruits countForObject:@"orange"]); 

將輸出:

2013-02-02 13:07:59.058 test[46614:c07] fruit count = 3 
2013-02-02 13:07:59.059 test[46614:c07] num apples = 3 
2013-02-02 13:07:59.062 test[46614:c07] num bananas = 2 
2013-02-02 13:07:59.062 test[46614:c07] num pears = 1 
2013-02-02 13:07:59.063 test[46614:c07] num oranges = 0 
+0

嗯......看起來很完美。將有一個去使用它。 – Fogmeister

1

NSCountedSet提供了一個非常完美的解決方案,但如果有人以任何理由需要字典而不是集合它不是創造這個「長手」的麻煩很多。 (如果你需要一次遍歷所有的鍵和值,這可能是有用的)。

NSMutableDictionary *dictionaryWithKeysAndNumbers = [[NSMutableDictionary alloc] init]; 

for (NSString *key in keysArray) { 
    if ([dictionaryWithKeysAndNumbers valueForKey:key]) { 
     NSNumber *numberOfKeyInstances = [dictionaryWithKeysAndNumbers valueForKey:key]; 
     NSInteger newValue = numberOfKeyInstances.intValue +1; 
     [dictionaryWithKeysAndNumbers setValue:[NSNumber numberWithInt:newValue] forKey:key]; 
    } 
    else{ 
     [dictionaryWithKeysAndNumbers setValue:[NSNumber numberWithInt:1] forKey:key]; 
    } 
}