我的数组jokesarray具有如下元素。我试图按嵌套元素“sec”排序。
每当我运行这个时,我会得到一个不同的排序顺序或每次我回到同一个视图(我的排序代码在viewwillappear中)。为什么呢?
{
"4eb57e72c7e24c014f000000" : {
"_id" : {
"$id" : "4eb57e72c7e24c014f000000"
},
"author" : "tim",
"comments" : [],
"created": {
"sec" : 1320517234,
"used" : 856000
},
"picture" : "http://someurl.com",
"text" : "this is a test",
"title" : "test",
"type" : ["test"]
}
jokesArray = [unSortedContentArray sortedArrayUsingFunction:Sort_Created_Comparer context:self];
NSInteger Sort_Created_Comparer(id array1, id array2, void *context)
{
int v1 = (int)[[array1 objectForKey:@"created"] objectForKey:@"sec"];
int v2 = (int)[[array2 objectForKey:@"created"] objectForKey:@"sec"];
if (v1 < v2)
return NSOrderedAscending;
else if (v1 > v2)
return NSOrderedDescending;
else
return NSOrderedSame;
}
答案 0 :(得分:6)
[[array1 objectForKey:@"created"] objectForKey:@"sec"]
返回指向对象的指针;在您的情况下,NSNumber
对象。当你把它投射到int
时:
(int)[[array1 objectForKey:@"created"] objectForKey:@"sec"]
您正在将该对象所在的内存地址转换为int
值,因为-objectForKey:
会返回指向对象的指针。
由于您对内存地址不感兴趣,而是对基础int
值不感兴趣,请使用-[NSNumber intValue]
:
int v1 = [[[array1 objectForKey:@"created"] objectForKey:@"sec"] intValue];
此外,您将词典命名为array1
和array2
很奇怪 - 它们不是数组。
修改或者,您可以让NSNumber
为您进行比较:
NSInteger Sort_Created_Comparer(NSDictionary *d1, NSDictionary *d2, void *context)
{
NSNumber *n1 = [[d1 objectForKey:@"created"] objectForKey:@"sec"];
NSNumber *n2 = [[d2 objectForKey:@"created"] objectForKey:@"sec"];
return [n1 compare:n2];
}
答案 1 :(得分:2)
方法-objectForKey:
返回NSNumber
对象指针。它不能直接转换为数字,请调用[NSNumber intValue]
来获取此对象的值。
但是,你可能想要做的更简单:
jokesArray = [unSortedContentArray sortedArrayUsingDescriptors:
[NSArray arrayWithObject:
[[NSSortDescriptor initWithKey:@"created.sec"
ascending:YES] autorelease]]];