我有一个名为Person
的自定义对象,其中包含一个名为NSString
的{{1}}字段,该字段存储descriptor
对象所属的那种人(生气,悲伤,狂野,快乐,郁闷等)。我的所有Person对象都在Person
中,但我想以这样的方式将它们存储在NSMutableArray
中:
键:A,对象:NSMutableDictionary
所有NSMutableArray
个对象的Person
以“A”开头
键:B,对象:descriptor
所有NSMutableArray
个对象的Person
以“B”开头
键:C,对象:descriptor
所有NSMutableArray
个对象的Person
以“C”开头
等...
我尝试在下面的代码中执行此操作,并且在注释// POINT 1处,键和数组似乎匹配,但在// POINT 2,当我打印出完整的字典时,所有键得出相同的值!
所以我想知道为什么descriptor
我似乎没有按照我想要的方式存储在NSMutableArray
中?
NSMutableDictionary
因此,例如,在POINT 1,我的输出是:
A
愤怒
有亲和力
乙
交战国
C
冷
...
w ^
野生
但是在POINT 2我的输出是
Ť
野生
Ĵ
野生
A
野生
...
w ^
野生
答案 0 :(得分:2)
将[tempDict setObject:personsStartingWithLetter forKey:[indexList objectAtIndex:([indexList count] - 1)]];
(在第1点之后)更改为[tempDict setObject:[[personsStartingWithLetter copy] autorelease] forKey:[indexList objectAtIndex:([indexList count] - 1)]];
。问题是NSDictionary复制了密钥,但保留了该值。因此,如果将可变数组添加到字典然后更改它,则字典中的数组也会更改。您需要创建一个不可变的数组副本以放入字典中。
答案 1 :(得分:0)
整个方法有点过于复杂。
- (void)buildDictionaryForIndexList
{
NSMutableDictionary *tempDict = [[[NSMutableDictionary alloc] init] autorelease];
for (Person *v in persons)
{
NSString* firstLetter = [[v descriptor] substringWithRange:NSMakeRange(0, 1)];
NSMutableArray* personsStartingWithLetter = tempDict [firstLetter];
if (personsStartingWithLetter == nil)
{
personsStartingWithLetter = [NSMutableArray array];
tempDict [firstLetter] = personsStartingWithLetter;
}
[personsStartingWithLetter addObject:v];
} // for
self.dictionary = tempDict;
}
您从一个包含数组的空字典开始。对于每个人,您检查是否有合适的数组,如果没有,则创建它。所以现在 是一个人的数组,所以你把它添加到数组中。就这样。