我有一个数组 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。
答案 0 :(得分:3)
可能我错过了这一点,但听起来你大肆过分复杂。
NSArray *sortedArray = [appd.arrOfDictAppProd sortedArrayUsingDescriptors:
@[
[NSSortDescritptor sortDescriptorWithKey:@"price.intValue" ascending:YES]
]];
如果您想创建newarray
- 或者只是没有手动循环 - 那么请使用:
NSArray *newarray = [appd.arrOfDictAppProd valueForKeyPath:@"price.intValue"];
这里所依赖的机制是键值编码。我还基于NSDictionary
和NSArray
实现键值编码的具体方式。
-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循环之后立即。您不需要排序描述符。