NSMutableDictionary
をNSString
にマップするNSString
があります(値はNSStrings
ですが、実際には単なる整数です)。
たとえば、次のマッピングを考えてみましょう。
"dog" --> "4"
"cat" --> "3"
"turtle" --> "6"
値の降順で並べ替えられた辞書の上位10エントリで終了したいと思います。誰かがこれのコードを見せてくれますか?おそらく、キーの配列と値の別の配列があります。でもそれでも構わない。私はそれを効率的にしようとしているだけです。
ありがとうございました!
値の配列を取得し、その配列を並べ替えてから、値に対応するキーを取得します。
次のようにして値を取得できます。
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]
コンパレータ関数であること( 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;
}
この方法を使用します。
- (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];
}
最も簡単な方法は次のとおりです。
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];
}
}
}
キーをソートし、それを使用して配列に値を入力します。
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];
}
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"interest" ascending:YES];
[unsortedArray sortUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]];
recentSortedArray = [stories copy];
このような例のキー「名前」の昇順でデータをソートする場合は、これが役立つことがあります。
arrayAnimalList = [{'name' = Dog、 'animal_id' = 001}、{'name' = Rat、 'animal_id' = 002}、{'name' = 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];