按CGFloat值升序排序对象数组并存储到字典的问题求助
解决OC自定义对象数组按CGFloat属性排序的问题
你的代码失效的核心原因很简单:CGFloat是Objective-C里的基本数据类型,不是NSNumber这类OC对象,所以你不能直接调用它的compare:方法——这个方法只有NSNumber等对象类型才会实现。
直接把你的排序代码改成下面这样就可以正常工作了:
// 不需要额外的for循环,直接对整个数组排序即可 NSArray *sortedArray = [items sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { CGFloat first = [(PNPieChartDataItem*)a value]; CGFloat second = [(PNPieChartDataItem*)b value]; if (first < second) { return NSOrderedAscending; // 升序规则:first排在second前面 } else if (first > second) { return NSOrderedDescending; } else { return NSOrderedSame; } }];
额外补充:
- 你原来写的
for循环完全没必要,sortedArrayUsingComparator:会自动遍历整个数组完成排序,直接返回排序后的新数组。 - 如果要把排序后的数组存入字典,直接将
sortedArray作为对应key的value存入即可,示例:NSMutableDictionary *resultDict = [NSMutableDictionary dictionary]; resultDict[@"sortedPieChartItems"] = sortedArray;
另外,如果你想让代码更简洁,也可以把CGFloat包装成NSNumber再调用compare方法,不过上面的写法更直接高效:
return [[NSNumber numberWithFloat:first] compare:[NSNumber numberWithFloat:second]];
内容的提问来源于stack exchange,提问作者user7477041
相关产品推荐
相关产品推荐

