在不使用任何键的情况下使用 NSSortDescriptor 对数组进行排序?

Sort an array using NSSortDescriptor without use of any key?

我有一个数组 appd.arrOfDictAppProd,其中有一个键 Price,它是一个字符串值。但我想按价格值对这个数组进行排序。所以我从 appd.arrOfDictAppProd 数组中获取 Price 键并将 Price 转换为 String 到 Int,然后创建一个没有任何键的 NSMutableArray newarray。我想使用 NSSortDescriptor 对此进行排序,而不使用任何 Key 因为在我的 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.

因为newarray只是一个NSNumber的(可变)数组,而NSNumber实现了compare:方法,所以可以调用

[newarray sortArrayUsingComparator:@selector(compare:)];

紧接在 for 循环之后。您不需要排序描述符。

可能我没抓住要点,但听起来你把事情搞得太复杂了。

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

如果你想创建 newarray 无论如何 - 或者只是没有你的手动循环 - 然后去:

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

这里依赖的机制是键值编码。我还建立了 NSDictionaryNSArray 实现键值编码的特定方式。

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

因此,您可以使用 [stringObject valueForKey:@"intValue"] 访问 stringObject 上的 intValue 属性,然后让 NSObject 将其打包成 NSNumber.

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

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

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