对包含NSNumber变量的NSobjects的NSArray进行排序

时间:2014-03-01 07:24:32

标签: ios nsarray nsdictionary nsnumber nsobject

我有一个对象类的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变量的第一个和第二个将非常有用。

4 个答案:

答案 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)

如果您的自定义类具有属性firstsecond,那么您发布的代码将起作用。

NSNumber已经知道如何将自己与其他数字进行比较。 NSSortDesvriptor可以处理任何实现键值编码读取部分的对象。对于遵循普通约定的任何属性,所有NSObject子类都会自动执行此操作。 @property遵循普通惯例。