0

i have storage of the entity "SchedulesItems". and when i try group result of this storage i have trouble with order of keys. for example:

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

why sort order of the dictionary is broken?

p.s. sorry for my english - i am from russia

4

3 回答 3

0

字典不是一个数组,其对象可以通过索引访问并因此具有顺序。在字典中,对象及其键不以任何特定顺序存储。字典中的对象只能通过它们的键来访问。

于 2013-09-17T06:10:27.903 回答
0

因为方法allKeys没有排序。从文档中:

allKeys 返回一个包含字典键的新数组。

  • (NSArray *)allKeys 返回值 包含字典键的新数组,如果字典没有条目,则为空数组。

讨论 未定义数组中元素的顺序。

附言。如果将这两行结合起来会快得多:

index   =   [keysForDictionary indexOfObject:date];
[[objectsForDictionary objectAtIndex:index] addObject:schedulesItem];

进入:

[[objectsForDictionary objectAtIndex:[keysForDictionary count]-1 addObject:schedulesItem];

此外,如果日期不是唯一的,您的逻辑将失败,因为 IndexOfObject:date 如果有重复的日期,将在数组中返回错误的行。

pps。为什么要使用数组来构建返回字典?为什么不直接在遍历 items 数组时将元素添加到返回字典中呢?

于 2013-09-17T06:12:07.810 回答
0

正如其他人已经说过的 NSDictionary 没有按设计排序。但是,您可以在 NSArray 中保留对字典的引用,或者在之后对键进行排序,例如:

NSArray *sortedKeys = [[returnDictionary allKeys] sortedArrayUsingSelector:@selector(compare:)];

于 2013-09-17T06:19:41.943 回答