0

エンティティ「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

辞書のソート順が壊れているのはなぜですか?

ps私の英語でごめんなさい-私はロシア出身です

4

3 に答える 3

0

他の人がすでに言ったように、NSDictionary は設計上ソートされていません。ただし、辞書への参照を NSArray に保持するか、後で次のようにキーを並べ替えることができます。

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

于 2013-09-17T06:19:41.943 に答える
0

ディクショナリは、オブジェクトがインデックスによってアクセスできる配列ではないため、順序があります。ディクショナリでは、キーを持つオブジェクトは特定の順序で格納されません。ディクショナリ内のオブジェクトには、キーを介してのみアクセスできます。

于 2013-09-17T06:10:27.903 に答える
0

メソッドallKeysが順序付けられていないためです。ドキュメントから:

allKeys ディクショナリのキーを含む新しい配列を返します。

  • (NSArray *)allKeys 戻り値 ディクショナリのキーを含む新しい配列、またはディクショナリにエントリがない場合は空の配列。

考察 配列内の要素の順序は定義されていません。

ps。これらの2行を組み合わせると、はるかに高速になります。

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

の中へ:

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

また、日付が重複している場合、 IndexOfObject:date が配列内で間違った行を返すため、日付が一意でない場合、ロジックは失敗します。

pps。配列を使用して戻り辞書を作成するのはなぜですか? items 配列をループするときに、要素を return ディクショナリに直接追加しないのはなぜですか?

于 2013-09-17T06:12:07.810 に答える