我有一个带有键前缀@like的字典数组

时间:2015-06-27 06:36:54

标签: ios objective-c

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

2 个答案:

答案 0 :(得分:0)

我认为你不能在KVC Collection中使用@。密钥路径中的@,它表示特定的聚合函数,例如@count@sum

  

简单集合运算符

     

@count:以NSNumber的形式返回集合中的对象数。

     

@sum:将集合中的每个对象转换为double,计算总和,并将总和作为NSNumber返回。

     

@avg:获取集合中每个对象的double值,并将平均值作为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"}
                             ];

答案 1 :(得分:0)

你可以这样排序

NSMutableArray *sortedArray = [arrHotelResults sortedArrayUsingComparator:^(NSDictionary *obj1, NSDictionary *obj2) {
  return [obj1[@"@HIndex"] compare:obj2[@"@HIndex"]];
}].mutableCopy;