使用对象对NSArray进行排序

时间:2011-08-04 02:17:54

标签: ios sorting nsarray

假设NSArray有几个属于两个类的对象,

@interface FWNewsObj:NSObject
 {
  NSString *newsTitle;
  NSDate *newsTime;
 }
 @end




@interface FWPhotoObj:NSObject
 {
  NSString *photoTitle;
  NSDate *photoTime;
 }
 @end

我想用对象的标题(或时间)对NSArray进行排序。但是,每个类中的title变量具有不同的名称。

然后我该怎么做呢? 感谢。

2 个答案:

答案 0 :(得分:2)

我立即想到的是(如果我正确理解了Q):

  • 1st创建一个字典,其中titleNames为键,value为对象
  • 简单地对键阵列进行排序
  • 然后根据此排序的键数组
  • 创建一个排序的对象数组,将它们从字典中拉出

答案 1 :(得分:1)

您必须编写一个您的类实现的自定义比较方法。它必须将一个对象作为参数并返回NSComparisonResultNSOrderedAscendingNSOrderedDescendingNSOrderedSame

然后,您可以使用自己的比较方法sortedArrayUsingSelector:

示例:

在FWNewsObj中:

- (NSComparisonResult)compareTitle:(id)obj
{
    NSAssert([obj isKindOfClass:[FWNewsObj class]] || [obj isKindOfClass:[FWPhotoObj class]], @"Don't know how to compare %@ to %@", self, obj);
    if ([obj isKindOfClass:[FWPhotoObj class]]) {
        return [newsTitle compare:[(FWPhotoObj *)obj photoTitle]];
    } else {
        return [newsTitle compare:[(FWNewsObj *)obj newsTitle]];
    }
}

在FWPhotoObj中:

- (NSComparisonResult)compareTitle:(id)obj
{
    NSAssert([obj isKindOfClass:[FWNewsObj class]] || [obj isKindOfClass:[FWPhotoObj class]], @"Don't know how to compare %@ to %@", self, obj);
    if ([obj isKindOfClass:[FWPhotoObj class]]) {
        return [photoTitle compare:[(FWPhotoObj *)obj photoTitle]];
    } else {
        return [photoTitle compare:[(FWNewsObj *)obj newsTitleTitle]];
    }
}

在包装photoTitle或newsTitle的两个类中定义一个title方法实际上会更容易。然后,您可以NSSortDescriptor使用title作为密钥。