10

値を追加すると、NSMutableDictionaryキーごとに自動的に設定されます。どうすればそれを無効にして、最初のセットの最初と2番目のセットのように配置できますか。

NSMutableDictionary* filteredDictionary = [NSMutableDictionary dictionary];

[filteredDictionary setObject:@"abc" forKey:@"1"];
[filteredDictionary setObject:@"abc" forKey:@"3"];
[filteredDictionary setObject:@"abc" forKey:@"2"];
[filteredDictionary setObject:@"abc" forKey:@"5"];
[filteredDictionary setObject:@"abc" forKey:@"4"];

NSLog(@"%@",filteredDictionary);

current output:
{
1 = abc;
2 = abc;
3 = abc;
4 = abc;
5 = abc;    
}

but i want 
{
1 = abc;
3 = abc;
2 = abc;
5 = abc;    
4 = abc;
}

キーごとの並べ替えを無効にする方法はありますか?

4

4 に答える 4

4

NSDictionaryはキーを並べ替えていません。ディクショナリ内のキーの順序は、順序付けされていないコレクションであるため定義されていません。

つまり、フェッチ中に要素を使用keysSortedByValueUsingSelector:またはkeysSortedByValueUsingComparator:ソートしない限り、要素をフェッチ/印刷するときに要素の順序を信頼できないということです。

これはallKeysのマニュアルでも確認できます。

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

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

キー/値を で必要な順序に保つ方法はないNSDictionaryため、追加した順序と同じ順序でキー/値を並べる必要がある場合は、基本的に 2 つのオプションがあります。

  • NSArrayにそれらを追加すると同時に、順序付けられたコレクション ( など) にそれらを追加/削除し、そのNSDictionaryコレクションを順序付けられたアクセスに使用します。
  • 追加するたびにカウントアップするディクショナリに追加するデータにフィールドを追加しkeysSortedByValueUsingComparator:、配列からすべてのキーをフェッチするときにそのフィールドを使用して順序付けます。
于 2012-10-04T12:29:05.590 に答える
2

これを行う方法は次のとおりです。

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"key" ascending:YES comparator:^(id obj1, id obj2) {

    if (obj1 > obj2) {
        return (NSComparisonResult)NSOrderedDescending;
    }
    if (obj1 < obj2) {
        return (NSComparisonResult)NSOrderedAscending;
    }
    return (NSComparisonResult)NSOrderedSame;
}];

NSArray *sortedKeys = [[filteredDictionary allKeys] sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];

NSMutableDictionary *orderedDictionary = [NSMutableDictionary dictionary];

for (NSString *index in sortedKeys) {
    [orderedDictionary setObject:[filteredDictionary objectForKey:index] forKey:index];
}

filteredDictionary = orderedDictionary;
于 2012-10-04T12:36:03.803 に答える
1

挿入しているときにNSDictionary データを取得できません。
挿入するデータに応じてデータを取得したい場合は、配列を使用できます。

于 2012-10-04T13:14:42.270 に答える
1

NSDictionaryソートするためのものではありません。その配列を使用してすべてのキーを取得allKeysし、好みに合わせて並べ替えることで、並べ替えることができます。次に、この配列をループして、対応する値を取得します。

于 2012-10-04T12:26:38.507 に答える