2010-12-29 15 views
19

NSMutableDictionaryNSStringからNSStringにマッピングされています(値はNSStringsですが、実際は整数です)。例えばNSMutableDictionaryをソートする

"dog" --> "4" 
"cat" --> "3" 
"turtle" --> "6" 

、次のマッピングを考える私は、値の順序を減少させることによってソートされた辞書のトップ10のエントリで終わるしたいと思います。誰かが私にこのコードを表示できますか?おそらく、キー配列と値の配列があります。しかし、それは、私は気にしません。私はそれを効率的にしようとしているだけです。

ありがとうございました!

答えて

46

値の配列を取得し、その配列をソートして、値に対応するキーを取得します。

あなたが使用して値を取得することができます。

NSArray* values = [myDict allValues]; 
NSArray* sortedValues = [values sortedArrayUsingSelector:@selector(comparator)]; 

しかし、あなたはあなたの例で示したようコレクションが(私が意味する、あなたがキーから値を推測することができます)、であるならば、あなたはいつでも並べ替えることができます代わりにキーを使用しています。

使用:

NSArray* sortedKeys = [myDict keysSortedByValueUsingSelector:@selector(comparator)]; 

コンパレータは、あなたが注文したいオブジェクトに送信されたメッセージセレクタです。

文字列を並べ替える場合は、NSStringコンパレータを使用する必要があります。 NSStringコンパレータは、caseInsensitiveCompareまたはlocalizedCaseInsensitiveCompare:です。

これらのいずれでも有効でない場合、あなたは

[values sortedArrayUsingFunction:comparatorFunction context:nil] 

ビーイングcomparatorFunction(AppleDocumentationから)

NSInteger intSort(id num1, id num2, void *context) 
{ 
    int v1 = [num1 intValue]; 
    int v2 = [num2 intValue]; 
    if (v1 < v2) 
     return NSOrderedAscending; 
    else if (v1 > v2) 
     return NSOrderedDescending; 
    else 
     return NSOrderedSame; 
} 
+0

はオーケーを取得するのに役立つコードですそれでは、私はあなたの第二の方法を使用したいとしましょう。正確には「コンパレータ」とは何ですか?申し訳ありません。以前はこの方法を使用したことがありませんでした。それは私自身の関数を書く必要があるということですか?それはどのように見えるでしょうか?ありがとう!! – CodeGuy

+0

レスポンスを編集しましたが、今は十分であることを願っています – HyLian

+2

@HyLian NSDictionaryに異なるキーの重複値が含まれているとどうなりますか?どのキーをピックアップするべきかをどのように追跡するのですか? –

0
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"interest" ascending:YES]; 
[unsortedArray sortUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]]; 
recentSortedArray = [stories copy]; 
4

独自のコンパレータ機能を呼び出すことができる最も簡単な方法は次のとおりです。

NSArray *sortedValues = [[yourDictionary allValues] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 
NSMutableDictionary *orderedDictionary=[[NSMutableDictionary alloc]init]; 
for(NSString *valor in sortedValues){ 
    for(NSString *clave in [yourDictionary allKeys]){ 
     if ([valor isEqualToString:[yourDictionary valueForKey:clave]]) { 
      [orderedDictionary setValue:valor forKey:clave]; 
     } 
    } 
} 
+0

これは効率的ではなく、受け入れられる答えには適切な解決策があります。 – Cutetare

3

キーをソートし、値を持つ配列を移入することを使用して:

NSArray *keys = [dict allKeys]; 
NSArray *sKeys = [keys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; 
NSMutableArray *sValues = [[[NSMutableArray alloc] init] autorelease]; 

for(id k in sKeys) { 
    id val = [dict objectForKey:k]; 
    [sValues addObject:val]; 
} 
+0

辞書を、ソートされた配列に相当するもの(キーでソート)に翻訳するのに最適です。 –

+0

2桁の数字はソートされていません。 – Rajesh

4

このメソッドを使用:

- (NSArray *)sortKeysByIntValue:(NSDictionary *)dictionary { 

    NSArray *sortedKeys = [dictionary keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
     int v1 = [obj1 intValue]; 
     int v2 = [obj2 intValue]; 
     if (v1 < v2) 
      return NSOrderedAscending; 
     else if (v1 > v2) 
      return NSOrderedDescending; 
     else 
      return NSOrderedSame; 
    }]; 
    return sortedKeys; 
} 

はそれを呼び出すと、値によってソートされたキーを使用して新しい辞書を作成します。

NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys: 
          @"4", @"dog", 
          @"3", @"cat", 
          @"6", @"turtle", 
          nil]; 

NSArray *sortedKeys = [self sortKeysByIntValue:dictionary]; 
NSMutableDictionary *sortedDictionary = [[NSMutableDictionary alloc] init]; 

for (NSString *key in sortedKeys){ 
    [sortedDictionary setObject:dictionary[key] forKey:key]; 
} 
0

このような種類の例でキー 'name'の昇順でデータをソートする場合は、これが役立ちます。

arrayAnimalList = [ { '名称' =犬、 'animal_id' = 001 }、 { '名称' =ラット、 'animal_id' = 002 }、 { 「名前'= Cat、 ' animal_id '= 003 } ];

これは、あなたがソートされた配列

//here you have to pass key for which you want to sort data 

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 

    NSArray *sortDescriptors = [NSArray arrayWithObject:descriptor]; 

    // here you will get sorted array in 'sortedArray' 
    NSMutableArray * sortedArray = [[arrayAnimalList sortedArrayUsingDescriptors:sortDescriptors] mutableCopy]; 
関連する問題