使用不同的类和键对数组进行排序

时间:2013-09-16 16:31:29

标签: ios objective-c arrays sorting nssortdescriptor

我想用不同的描述符键对对象进行排序。)

问题:

我有两个数组,其中填充了不同类的对象。这两个类不共享一个公共属性用作排序描述符。

我想按字母顺序对数组进行排序,并只返回一个包含所有对象的数组。

  • Array1 = with objects [A Class]
    • 按“名称”排序
  • Array2 = with objects [B Class]
    • 按“title”排序

FinalArray =>按字母顺序排列数组的所有对象(1,2)

2 个答案:

答案 0 :(得分:3)

你可以这样做:

  • 使用组合数组的大小创建NSArray *result
  • 将两个数组连接到result数组,方法是将第一个数组的元素后跟第二个数组的元素复制到result
  • sortedArrayUsingComparator:与“理解”两种类型的比较器一起使用。

这是一个骨架实现:

NSArray *sortedArray = [result sortedArrayUsingComparator: ^(id obj1, id obj2) {
    NSString *key1, *key2;
    if ([obj1 isKindOfClass:['class has a title' class]]) {
         key1 = [obj1 title];
    } else { // It's the kind of objects that has a name
        key1 = [obj1 name];
    }
    if ([obj2 isKindOfClass:['class has a title' class]]) {
         key2 = [obj2 title];
    } else { // It's the kind of objects that has a name
        key2 = [obj2 name];
    }
    // Do the comparison
    return [key1 caseInsensitiveCompare:key2];
}];

答案 1 :(得分:0)

一种可能的解决方案:将所有数组对象添加到NSMutableDictionary,其中键是" name"或"标题"在适当的时候,然后拉出所有字典键,对它们进行排序,并通过排序键将对象检索到一个新数组中:

NSMutableDictionary* dict = [NSMutableDictionary dictionary];
for (a in array1) {
    [dict setObject:a forKey:a.name];  // assumes name is property
}
for (b in array2) {
    [dict setObject:b forKey:b.title]; // assumes title is property
}
NSArray* sortedKeys = [[dict allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
NSArray* objects = [dict objectsForKeys:sortedKeys notFoundMarker:[NSNull null]];