我有NSMutableDictionary
将NSString
映射到NSString
(尽管值为NSStrings
,但它们实际上只是整数)。
例如,考虑以下映射,
"dog" --> "4"
"cat" --> "3"
"turtle" --> "6"
我希望最终得到字典中的前10个条目,按值的递减顺序排序。有人可以给我看这个代码吗?也许有一组键和另一组值。不管怎样,我不介意。我只是想让它变得高效。
谢谢!
答案 0 :(得分: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;
}
答案 1 :(得分: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];
}
}
}
答案 2 :(得分: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];
}
答案 3 :(得分: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];
}
答案 4 :(得分:0)
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"interest" ascending:YES];
[unsortedArray sortUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]];
recentSortedArray = [stories copy];
答案 5 :(得分:0)
如果你想按照这种类型的例子的关键'名称'按升序对数据进行排序,那么这可能对你有帮助。
arrayAnimalList = [ { 'name'=狗, 'animal_id'= 001 }, { 'name'=老鼠, 'animal_id'= 002 }, { 'name'=猫, '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];