如何通过其类的成员(即int或float)对NSMutableArray对象进行排序

时间:2010-04-23 17:53:51

标签: objective-c sorting nsmutablearray

我有一个类(来自NSObject),其中包含:

NSString name
int      position
float    speed

然后我从这个类创建一个对象的数组(NSMutableArray)。我想根据'speed'值对数组进行排序,该值为float

我最初的float值为NSNumberint的值为NSInteger,我成功排序:

[myMutableArray sortUsingFunction:compareSelector context:@selector(position)];

其中myMutableArray是我的对象数组。

这是功能:

static int compareSelector(id p1, id p2, void *context) {
    SEL methodSelector = (SEL)context;
    id value1 = [p1 performSelector:methodSelector];
    id value2 = [p2 performSelector:methodSelector];
    return [value1 compare:value2];
}

现在我使用的是int而不是NSInteger,上述代码无效。是否有一个更低级的命令,我应该用它来执行排序?谢谢!

2 个答案:

答案 0 :(得分:5)

与drawonward相似,我建议在你的班级中添加一个比较方法:

- (NSComparisonResult)compareSpeed:(id)otherObject
{
    if ([self speed] > [otherObject speed]) {
        return NSOrderedDescending;
    } else if ([self speed] < [otherObject speed]) {
        return NSOrderedAscending;
    } else {
        return NSOrderedSame;
    }
}

(您可以使用三元运算符if折叠else if - else - test ? trueValue : falseValue,或者如果speed是具有{{{的对象1}}方法(例如NSNumber),你可以compare:。)

然后您可以按

排序
return [[self speed] compare:[otherObject speed]];

正如Georg在评论中所建议的那样,您也可以使用[myMutableArray sortUsingSelector:@selector(compareSpeed:)]; 来实现目标;如果你的目标是10.6,你也可以使用块和sortUsingComparator:(NSComparator)cmptr

答案 1 :(得分:1)

int compareSpeed( id p1 , id p2 , void *unused ) {
  return p1->speed > p2->speed ? 1 : p1->speed < p2->speed : -1 : 0;
}

虽然你真的应该把上面的方法变成你的类:

-(int) compareSpeed:(id)inOtherObjectOfSameType {
  return self->speed > inOtherObjectOfSameType->speed ? 1 : self->speed < inOtherObjectOfSameType->speed : -1 : 0;
}