2012-10-04 17 views
10

NSMutableDictionaryに値を追加すると、キーが自動的に設定されます。どのように私はそれを無効にすることができ、最初のセットと2番目のセット2番目のごとに整理することができます。NSDictionaryを無効にする方法自動的にキーをソートする

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; 
} 

キーごとにソートを無効にする方法はありますか?

+1

これは辞書の本物の問題だとわかります。また、値へのアクセスにはマイナーな変更があります。また、KeyValueのみでアクセスする必要があるため、このために直面​​している問題は何か分かりません。 –

+0

@amitrajputはいポイントです –

+0

説明文字列を出力するときにキーをソートするだけで、ハッシュテーブルに基づくメモリレイアウトは変更されません。あなたがそれを列挙すると、それはあなたに速いアクセスを与えることを意図しているので、ソートされません。 –

答えて

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; 
+0

このコードは、[NSMutableDictionary](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSMutableDictionary_Class/Reference/Reference)で使用可能な 'addObject'メソッドがないため、コンパイルに失敗します。 html)、それがOPのためにどのように働いているのだろうか。 –

+0

うわー、私はそれを書いたときに亀裂になっているに違いない...私はそれを修正します!それを見つけていただきありがとうございます。 –

1

NSDictionaryはソートされていません。 allKeysを使用してすべてのキーを取得し、その配列を好きなようにソートすることでソートできます。次に、この配列をループし、対応する値を取得します。

+0

しかし、もしあなたが私に教えてください知っている。 –

+0

JoachimとSimonの投稿を参照してください。 – Rengers

4

NSDictionaryがキーをソートしていない場合、辞書内のキーの順序はで定義されていませんこれは順序付けられていないコレクションなのでです。

keysSortedByValueUsingSelector:またはkeysSortedByValueUsingComparator:を使用してフェッチ/プリントするときに要素の順序を信頼できないことを意味します。

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

戻り値
辞書はエントリがない場合は、辞書のキー、または空の配列を含む新しい配列。

ディスカッション
配列内の要素の順序は、で定義されていません。

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

  • /順序付きコレクションからそれらを削除するには、それらを追加 - などNSArrayとして - あなたがNSDictionaryにそれらを追加し、注文したアクセスのためにそのコレクションを使うと同時に。
  • 追加するたびにカウントアップする辞書に追加するデータにフィールドを追加し、そのフィールドをkeysSortedByValueUsingComparator:で使用して、配列からすべてのキーをフェッチするときに並べ替えます。
1

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