使用NSSortDescriptor对数组进行排序而不使用任何密钥?

时间:2015-06-11 13:10:10

标签: objective-c nsmutablearray nssortdescriptor

我有一个数组 appd.arrOfDictAppProd ,其中有一个键价格,这是一个字符串值。但我想按价格值排序这个数组。所以我从 appd.arrOfDictAppProd 数组中获取Price键并将Price转换为String到Int,然后在没有任何键的情况下创建一个NSMutableArray newarray 。我想使用 NSSortDescriptor 对此进行排序,而不使用任何密钥,因为在我的newarray中没有密钥。我的代码在这里:

for (int i = 0; i<appd.arrOfDictAppProd.count; i++) {
    NSString *price_Value = [[appd.arrOfDictAppProd objectAtIndex:indexPath.row] objectForKey:@"price"];
    int price_IntValue = [price_Value intValue];
    NSLog(@"int value of prices:%d",price_IntValue);

    NSNumber *num = [NSNumber  numberWithInteger:price_IntValue];
    NSLog(@"number-%@",num);
    [newarray addObject:num];

}
NSLog(@"price array:%@",newarray);

NSSortDescriptor *sortDescriptor;
sortDescriptor =[[NSSortDescriptor alloc] initWithKey:@"num"
                                                    ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray1;
sortedArray1 = [newarray sortedArrayUsingDescriptors:sortDescriptors];

当我运行我的程序时,在 newarray 中我有14个值,但这些值相同,即为3。

2 个答案:

答案 0 :(得分:3)

可能我错过了这一点,但听起来你大肆过分复杂。

NSArray *sortedArray = [appd.arrOfDictAppProd sortedArrayUsingDescriptors:
    @[
        [NSSortDescritptor sortDescriptorWithKey:@"price.intValue" ascending:YES]
    ]];

如果您想创建newarray - 或者只是没有手动循环 - 那么请使用:

NSArray *newarray = [appd.arrOfDictAppProd valueForKeyPath:@"price.intValue"];

这里所依赖的机制是键值编码。我还基于NSDictionaryNSArray实现键值编码的具体方式。

-valueForKey:-valueForKeyPath:NSObject提供。忽略特殊情况和回退,对象将通过将该属性的值作为对象返回来响应前者 - 除此之外,它还会自动将内置数值类型转换为NSNumber s。后者将遍历对象层次结构,例如object.property1.property2会请求object,然后从property1请求object,然后从property2请求property1

您可以使用[stringObject valueForKey:@"intValue"]访问intValue上的stringObject媒体资源,然后NSObject将其打包成NSNumber

NSDictionary有一个键值编码实现,它会在字典中查找适当的值,除非它以@为前缀表示您需要有关的信息字典,而不是来自字典。由于您的密钥名称是不以@开头的字符串,因此valueForKey:最终会调用objectForKey:

因此,字典数组中带有键price.intValue的排序描述符将向每个字典询问键price的值。字典将决定拨打objectForKey:。它会得到一个字符串。它会在该字符串上调用intValue并返回int。然后将它包装成NSNumber并比较所有词典的数字以确定排序。

NSArray通过依次调用数组中每个项目的相应方法,然后返回包含所有结果的数组来实现valueForKey:valueForKeyPath:。因此,您可以使用键值编码作为在一定程度上映射结果的方法。

答案 1 :(得分:1)

由于newarray只是NSNumber的(可变)数组,而NSNumber实现了compare:方法,因此您可以调用

[newarray sortArrayUsingComparator:@selector(compare:)];
在for循环之后立即

。您不需要排序描述符。