初始化后,我遇到字典键的顺序问题

时间:2013-09-17 06:03:55

标签: ios sorting dictionary

我有实体“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。对不起我的英语 - 我来自俄罗斯

3 个答案:

答案 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(比较:)];