我有实体“SchedulesItems”的存储空间。 当我尝试这个存储的组结果我有按键顺序的麻烦。 例如:
NSMutableArray *keysForDictionary = [[NSMutableArray alloc] init];
NSMutableArray *objectsForDictionary = [[NSMutableArray alloc] init];
NSUInteger index = 0;
for ( EBResponseEventsSchedulesItem *schedulesItem in items ) {
NSDate *date = schedulesItem.date;
if ( ![keysForDictionary containsObject:date] ) {
[keysForDictionary addObject:date];
[objectsForDictionary addObject:[NSMutableArray array]];
}
index = [keysForDictionary indexOfObject:date];
[[objectsForDictionary objectAtIndex:index] addObject:schedulesItem];
}
// in this line array 'keysForDictionary' have right order, just like:
// 25.09.2013
// 26.09.2013
// 27.09.2013
// 28.09.2013
NSDictionary *returnDictionary = [[NSDictionary alloc] initWithObjects: objectsForDictionary forKeys:keysForDictionary];
// but this line array [returnDictionary allKeys] have wrong order, just like:
// 25.09.2013
// 28.09.2013
// 27.09.2013
// 26.09.2013
// but objects which associated with this keys is ok
为什么字典的排序顺序被打破了?
P.S。对不起我的英语 - 我来自俄罗斯
答案 0 :(得分:0)
字典不是一个数组,其对象可以通过索引访问,因此具有顺序。 在字典中,具有其键的对象不以任何特定顺序存储。字典中的对象只能通过其键访问。
答案 1 :(得分:0)
因为没有订购方法allKeys
。来自文档:
allKeys返回一个包含字典键的新数组。
- (NSArray *)allKeys返回值包含字典键的新数组,如果字典没有条目,则为空数组。
讨论未定义数组中元素的顺序。
PS。如果你将这两行结合起来会快得多:
index = [keysForDictionary indexOfObject:date];
[[objectsForDictionary objectAtIndex:index] addObject:schedulesItem];
成:
[[objectsForDictionary objectAtIndex:[keysForDictionary count]-1 addObject:schedulesItem];
此外,如果日期不唯一,您的逻辑将失败,因为如果有重复的日期,则IndexOfObject:date将返回数组中的错误行。
PPS。为什么要使用数组来构建返回字典?为什么不在循环遍历items数组时直接将元素添加到返回字典中?
答案 2 :(得分:0)
正如其他人已经说过NSDictionary在设计上没有分类。 但是,您可以在NSArray中保留对字典的引用,或者之后对键进行排序,如:
NSArray * sortedKeys = [[returnDictionary allKeys] sortedArrayUsingSelector:@selector(比较:)];