如何对 NSArray 中的数字进行排序?
Posted
技术标签:
【中文标题】如何对 NSArray 中的数字进行排序?【英文标题】:How to sort numbers in NSArray? 【发布时间】:2012-06-24 16:48:55 【问题描述】:我无法拼凑出如何做到这一点。
我从一个 plist 中获取我的数组,这个数组充满了数字(在 plist 中设置)。现在我需要做的就是对它们进行排序,使它们降序,但我无法解决。
【问题讨论】:
【参考方案1】:试试这个代码?
NSArray *array = /* loaded from file */;
array = [array sortedArrayUsingSelector: @selector(compare:)];
【讨论】:
但是选择器方法的内容是什么呢?这就是吸引我的原因。-compare:
方法是为 NSNumber
实例定义的:developer.apple.com/library/mac/documentation/Cocoa/Reference/…:
这就是我的意思。也许我误解了文档,但我尝试过使用和不使用 compare 方法,它总是让应用程序崩溃,说无法识别的选择器。
这很奇怪。那么你的阵列一定有问题。
看来(根据您对另一个答案的评论)您已经用数字 as strings 而不是 as numbers 填充了 .plist .【参考方案2】:
以下将数字按升序排序,然后将结果反转以降序给出数字:
NSArray *sorted = [[[array sortedArrayUsingSelector:@selector(compare:)] reverseObjectEnumerator] allObjects];
上一个问题还有其他一些选择: Sort an NSArray in Descending Order
【讨论】:
我遇到了-[__NSCFString sortedArrayUsingSelector:]: unrecognized selector sent to instance
的崩溃。
您确定在NSArray
上调用sortedArrayUsingSelector:
吗?您似乎正在通过NSString
呼叫sortedArrayUsingSelector:
。您可能应该检查从 Plist 加载的数据结构。
@Josh Kahane,如果是这样,您很可能遇到内存管理问题,因为您的 array
指针指向 NSString
对象。忘记保留/太多 [auto] 发布?
这个答案完全回答了问题,因为它对数组降序进行排序。【参考方案3】:
这是使用比较块的众多方法之一。这段代码 sn-p 对于任何要排序的数字数组都很方便。 对于升序:
AscendingArray = [UnsortArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2)
if ([obj1 integerValue] > [obj2 integerValue])
return (NSComparisonResult)NSOrderedDescending;
if ([obj1 integerValue] < [obj2 integerValue])
return (NSComparisonResult)NSOrderedAscending;
return (NSComparisonResult)NSOrderedSame;
];
降序:
DescendingArray = [UnsortArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2)
if ([obj1 integerValue] > [obj2 integerValue])
return (NSComparisonResult)NSOrderedAscending;
if ([obj1 integerValue] < [obj2 integerValue])
return (NSComparisonResult)NSOrderedDescending;
return (NSComparisonResult)NSOrderedSame;
];
【讨论】:
为什么不直接使用 NSNumbercompare:
?
我使用了这种方法,因为即使我的一些数据是数字,我也将所有内容都存储为字符串。此方法可以比较存储为字符串的数字,与比较相反:方法【参考方案4】:
它对我有用:
NSSortDescriptor *sortIdClient =
[NSSortDescriptor sortDescriptorWithKey:@"campaignValue"
ascending:NO
comparator: ^(id obj1, id obj2)
return [obj1 compare:obj2 options:NSNumericSearch];
];
NSArray *sortDescriptors = @[sortIdClient];
NSArray *arrTemp = [self.allCampaignsList sortedArrayUsingDescriptors:sortDescriptors];
【讨论】:
【参考方案5】:这将解决问题:
NSArray *array = /* loaded from file */;
array = [array sortedArrayUsingSelector: @selector(compare:)];
【讨论】:
请去掉使文本显示为代码的额外缩进以上是关于如何对 NSArray 中的数字进行排序?的主要内容,如果未能解决你的问题,请参考以下文章
如何对 NSArray 进行排序并在 NSString 中访问?
使用 NSPredicate 对 NSArray 进行排序,然后存储在一个新数组中