@{@"@Add" : @"Sheikh Zayed Road,Dubai",
@"@Front_Image" : @"http://images.travelnow.com/hotels/1000000/920000/919000/918930/918930_81_z.jpg",
@"@HDes" : @"Property Location-With a stay at Shangri-La Hotel ",
@"@HIndex" : @5,
@"@HName" : @"ShangriLa Hotel Dubai",
@"@Lattitude" : @"25.20798",
@"@Longitude" : @"55.27221",
@"@Max_Price" : @"261.73",
@"@Min_Price" : @"1960.02",
@"@Star_Rating" : @5,
@"@TripAdvisor" : @"4.5 Out of 5 ( 1122 reviews )",
@"@TripAdvisorURL" : @"http://www.tripadvisor.com/img/cdsi/img2/ratings/traveler/4.5-12345-4.gif",
@"@Type" : @"Hotels"}
我想用@HIndex
键按降序排序,但得到以下错误
[<__NSCFDictionary 0x7fcf75801af0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key HIndex.'
我的代码是
NSSortDescriptor *aSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"@HIndex" ascending:YES comparator:^(id obj1, id obj2) {
if ([obj1 integerValue] > [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedDescending;
}
if ([obj1 integerValue] < [obj2 integerValue]) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}];
NSMutableArray *sortedArray = [NSMutableArray arrayWithArray:[self.arrHotelResults sortedArrayUsingDescriptors:[NSArray arrayWithObject:aSortDescriptor]]];
您可以像这样排序
NSMutableArray *sortedArray = [arrHotelResults sortedArrayUsingComparator:^(NSDictionary *obj1, NSDictionary *obj2) {
return [obj1[@"@HIndex"] compare:obj2[@"@HIndex"]];
}].mutableCopy;
我认为您不能在KVC Collection中使用@
。密钥路径中的@
表示特定的聚合函数,例如@count
、@sum
等
简单采集操作员
@count:以NSNumber形式返回集合中的对象数。
@sum:将集合中的每个对象转换为双精度,计算和,并将和作为NSNumber返回。
@avg:取集合中每个对象的双倍值,并将平均值作为NSNumber返回。
@max:使用compare确定最大值:。对象必须支持相互比较才能工作。
@min:与@max相同,但返回集合中的最小值。
http://nshipster.com/kvc-collection-operators/
相反,您可以像这样使用NSComparator
:
NSString *key = @"@HIndex";
NSArray *results = [arrHotelResults sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
if ([obj1 objectForKey:key] > [obj2 objectForKey:key]) {
return (NSComparisonResult)NSOrderedDescending;
}
if ([obj1 objectForKey:key] < [obj2 objectForKey:key]) {
return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;
}];
NSLog(@"%@", results);
以下是我的测试数据:
NSArray *arrHotelResults = @[
@{@"@HIndex" : @5, @"@HName" : @"XYZ Plaza Hotel Dubai"},
@{@"@HIndex" : @3, @"@HName" : @"Beijing"},
@{@"@HIndex" : @10, @"@HName" : @"Xiamen"},
@{@"@HIndex" : @2, @"@HName" : @"Wuhan"},
@{@"@HIndex" : @1, @"@HName" : @"Taj Palace"}
];