【问题标题】:Sort NSMutableArray with custom objects by another NSMutableArray [duplicate]通过另一个 NSMutableArray 使用自定义对象对 NSMutableArray 进行排序 [重复]
【发布时间】:2013-04-03 08:57:05
【问题描述】:

我有 2 个NSMutableArrays。第一个数组包含属性为NSString *itemID 的自定义对象实例,第二个数组仅包含来自NSString 的具有相同itemID 值的对象,但顺序不同。我需要按每个对象的itemID 属性对第一个数组进行排序,它应该像第二个数组一样排序。

我该怎么做?

【问题讨论】:

标签: iphone ios objective-c sorting nsmutablearray


【解决方案1】:
guideArray = < YOUR SECOND ARRAY WITH STRING OBJECT >;    
unsortedArray = < YOUR FIRST ARRAY WITH CUSTOM OBJECT >;

[unsortedArray sortUsingComparator:^(id o1, id o2) {
    Items *item1 = o1;
    Items *item2 = o2;
    NSInteger idx1 = [guideArray indexOfObject:item1.ItemID];
    NSInteger idx2 = [guideArray indexOfObject:item2.ItemID];
    return idx1 - idx2;
}];
NSLog(@"%@",unsortedArray);

【讨论】:

  • 非常感谢,就是这样。
【解决方案2】:

将自定义对象存储在以itemID为键的字典中,使用此字典作为查找对对象进行排序:

    NSArray *objects; // your objects
    NSMutableArray *hintArray; // your sorted IDs
    NSMutableDictionary *lookupDict = [[NSMutableDictionary alloc] initWithCapacity:[objects count]];
    NSMutableArray *sortedObjects = [[NSMutableArray alloc] initWithCapacity:[hintArray count]];

    for (id object in objects) {
        [lookupDict setValue:object forKey:[object itemID]];
    }

    for (id hint in hintArray) {
        [sortedObjects addObject:[lookupDict valueForKey:hint]];
    }

编辑: 使用objects 的就地解决方案:

    NSMutableArray *objects;
    NSMutableArray *hintArray;
    NSMutableDictionary *lookupDict = [[NSMutableDictionary alloc] initWithCapacity:[hintArray count]];

    int i = 0;
    for (NSString *itemID in hintArray) {
        [lookupDict setValue:[NSNumber numberWithInt:i] forKey:itemID];
        i++;
    }

    [objects sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        return [[lookupDict valueForKey:[obj1 itemID]] compare:[lookupDict valueForKey:[obj2 itemID]]];
    }];

【讨论】:

  • NSDictionary 不添加到列表末尾。所以这无济于事
  • 我没有得到你的评论。我简单地构建了查找字典,以避免在排序的 id-list 中搜索每个项目,当您获得大量项目时,这将变得非常昂贵。
【解决方案3】:

您可以使用以下语法比较您的两个对象:-

[items sortUsingComparator:^NSComparisonResult(Attribute *obj1, Attribute *obj2) 
{
    return [[NSNumber numberWithInt:[stringOrder indexOfObject:obj1.itemID]] compare:[NSNumber numberWithInt:[stringOrder indexOfObject:obj2.itemID]]]
}];

否则您可以使用以下 sn-p :

NSArray* sortedKeys = [dict keysSortedByValueUsingComparator:^(id obj1, id obj2)
 {
    return [obj1 compareTo:obj2];
 }

享受编程!

【讨论】:

  • 谢谢,这也是有效的答案
猜你喜欢
  • 1970-01-01
  • 2012-05-15
  • 2012-01-17
  • 2012-01-12
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
相关资源
最近更新 更多