我有一个字典数组,关键字前缀为@like


@{@"@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"}
                             ];

最新更新