在不使用任何键的情况下使用 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"];
这里依赖的机制是键值编码。我还建立了 NSDictionary
和 NSArray
实现键值编码的特定方式。
-valueForKey:
和 -valueForKeyPath:
由 NSObject
提供。忽略特殊情况和回退,对象将通过将 属性 的值作为对象返回来响应前者——除其他外,它会自动将内置数字类型转换为 NSNumber
s。后者将遍历对象层次结构,例如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:
。所以你可以使用键值编码作为一种在一定程度上映射结果的方式。
我有一个数组 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"];
这里依赖的机制是键值编码。我还建立了 NSDictionary
和 NSArray
实现键值编码的特定方式。
-valueForKey:
和 -valueForKeyPath:
由 NSObject
提供。忽略特殊情况和回退,对象将通过将 属性 的值作为对象返回来响应前者——除其他外,它会自动将内置数字类型转换为 NSNumber
s。后者将遍历对象层次结构,例如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:
。所以你可以使用键值编码作为一种在一定程度上映射结果的方式。