我有一个对象类的NSArray,它由两个文本字段组成。我想按升序对这些对象进行排序,我之前已经使用NSDictionary对象完成了这个操作,但是我现在已经更改为我已经创建的Object类,所以我真的不知道如何比较这些值来获取排序的数组。 / p>
对象变量是 NSNumbers ,但只包含数字值,我认为这会对事物产生影响。
这就是我用旧代码对NSDictionary值进行排序的方式。
NSArray *tempSortedItemsArray = [installArray sortedArrayUsingDescriptors:
@[[NSSortDescriptor
sortDescriptorWithKey:@"first" ascending:YES],
[NSSortDescriptor
sortDescriptorWithKey:@"second" ascending:YES]]];
sortedItemsArray = [tempSortedItemsArray mutableCopy];
tempSortedItemsArray = nil;
所以,如果我有一个像这样的对象数组
(第一/第二)
2 1
0 0
1 0
1 1
2 2
2 0
3 0
如果会像这样排序
0 0
1 0
1 1
2 0
2 1
2 2
3 0
任何帮助为NSObject类调整这个,使用NSNumber变量的第一个和第二个将非常有用。
答案 0 :(得分:1)
[arr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSString *first=[NSString stringWithFormat:@"%d%d",obj1.num1.intValue,obj1.num2.intValue];
NSString *second=[NSString stringWithFormat:@"%d%d",obj2.num1.intValue,obj2.num2.intValue];
return [first compare:second options:NSNumericSearch];
}];
答案 1 :(得分:0)
您可以使用NSArray
的其他排序方法,例如:
sortedArrayUsingFunction:context:
sortedArrayUsingSelector:
sortedArrayUsingComparator:
答案 2 :(得分:0)
给定一个像这样工作的Object:
@interface Object : NSObject
@property (copy) NSNumber *first;
@property (copy) NSNumber *second;
+(Object *)objectWithWithFirst:(NSNumber *)first second:(NSNumber *)second;
@end
@implementation Object
+(Object *)objectWithWithFirst:(NSNumber *)first second:(NSNumber *)second {
Object *object = [[Object alloc] init];
object.first = first;
object.second = second;
return object;
}
-(NSString *)description {
return [NSString stringWithFormat:@"%@ %@", _first, _second];
}
@end
你可以用
排序NSArray *sorted = [array sortedArrayUsingComparator:^NSComparisonResult(Object *obj1, Object *obj2) {
NSComparisonResult result = [obj2.second compare:obj2.second];
if (result == NSOrderedSame)
result = [obj1.first compare:obj2.first];
return result;
}];
示例:
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSArray *array = @[
[Object objectWithWithFirst:@2 second:@1],
[Object objectWithWithFirst:@0 second:@0],
[Object objectWithWithFirst:@1 second:@0],
[Object objectWithWithFirst:@1 second:@1],
[Object objectWithWithFirst:@2 second:@2],
[Object objectWithWithFirst:@2 second:@0],
[Object objectWithWithFirst:@3 second:@0]
];
NSLog(@"%@", array);
NSArray *sorted = [array sortedArrayUsingComparator:^NSComparisonResult(Object *obj1, Object *obj2) {
NSComparisonResult result = [obj2.second compare:obj2.second];
if (result == NSOrderedSame)
result = [obj1.first compare:obj2.first];
return result;
}];
NSLog(@"%@", sorted);
}
return 0;
}
哪种方法可以完美地处理您的样本数据。当然,您可以将比较器代码直接放入Object类中 - 清理更多内容。
答案 3 :(得分:0)
如果您的自定义类具有属性first
和second
,那么您发布的代码将起作用。
NSNumber
已经知道如何将自己与其他数字进行比较。 NSSortDesvriptor
可以处理任何实现键值编码读取部分的对象。对于遵循普通约定的任何属性,所有NSObject
子类都会自动执行此操作。 @property
遵循普通惯例。