2016-08-04 54 views
0

我有2个不同的NSArray与自定义对象如下,排序NSArray中的自定义对象对象

Item *item1 = [[Items alloc] init]; 
item1.number = @"1"; 
item1.serailNumber = @"S01"; 

Item *item2 = [[Items alloc] init]; 
item2.number = @"2"; 
item2.serailNumber = @"S02"; 

Item *item3 = [[Items alloc] init]; 
item3.number = @"3"; 
item3.serailNumber = @"S03"; 

Item *item4 = [[Items alloc] init]; 
item4.number = @"4"; 
item4.serailNumber = @"S04"; 

Item *item5 = [[Items alloc] init]; 
item5.number = @"5"; 
item5.serailNumber = @"S05"; 

NSArray *items = @[item1, item2, item3, item4, item5]; 

NSArray *specList = @[@{"number" : @"002", @"serialNumber" : @"S02"}, 
        @{"number" : @"004", @"serialNumber" : @"S04"}, 
        @{"number" : @"003", @"serialNumber" : @"S03"}]; 

现在我想通过比较“number”属性基于specList阵列我items数组进行排序。

现在我的期望物件清单,

@[item2, item4, item3, item1, item5] 

我已经经历了几个样品去下面列出,但我无法弄清楚如何使用自定义的比较对象。任何帮助将不胜感激,提前致谢。

Sample 1 Sample 2

回答

0

这应该做的伎俩:

NSArray *sorted = [items sortedArrayUsingComparator:^NSComparisonResult(Item *item1, Item *item2) { 
    NSInteger indexForItemEquivalent1InSpecList = [self indexForItem:item1 inList:specList]; 
    NSInteger indexForItemEquivalent2InSpecList = [self indexForItem:item2 inList:specList]; 
    return [@(indexForItemEquivalent1InSpecList) compare:@(indexForItemEquivalent2InSpecList)]; 
}]; 

NSLog(@"Sorted: %@", sorted); 

随着:

-(NSInteger)indexForItem:(Item *)item inList:(NSArray *)list 
{ 
    for (NSInteger i = 0; i < [list count]; i++) 
    { 
     if ([list[i][@"number"] integerValue] == [[item number] integerValue]) 
     { 
      return i; 
     } 
    } 
    return NSIntegerMax; //If not found, we put it at the end of the list 
} 

输出:

Sorted: (
    "<Item 0x146678f0> number: 2 serial: S02", 
    "<Item 0x14667e10> number: 4 serial: S04", 
    "<Item 0x14667900> number: 3 serial: S03", 
    "<Item 0x14654200> number: 1 serial: S01", 
    "<Item 0x14667e20> number: 5 serial: S05" 
) 

我重写-description做记录更清晰:

-(NSString *)description 
{ 
    return [NSString stringWithFormat:@"<%@ %p> number: %@ serial: %@", [self class], self, _number, _serailNumber]; 
} 

换句话说:
你必须找到里面specList相应Item对象的索引(见indexForItem:inList:) 。我使用了integerValue,因为您使用的是@"002"和@“2”,它们不是相同的字符串。
然后在NSComparator中比较两个索引。

对于item1item5这是最后,我让他们仿佛。由于它们不在specList中,因此不能保证其订单。如果你想把它们按照“升序”顺序排列,你必须这样做:

NSInteger indexForItem1InSpecList = [self indexForItem:item1 inList:specList]; 
NSInteger indexForItem2InSpecList = [self indexForItem:item2 inList:specList]; 
if (indexForItem1InSpecList == NSIntegerMax && indexForItem2InSpecList == NSIntegerMax) 
{ 
    return [@([[item1 number] integerValue]) compare:@([[item2 number] integerValue])]; 
} 
else 
{ 
    return [@(indexForItem1InSpecList) compare:@(indexForItem2InSpecList)]; 
} 
+0

谢谢@Larme它工作:) –

-1

这里是排序第二阵列指的是第一个的一个示例:

NSArray *users = @[@"Dave",@"Mike",@"Joe",@"Jason",@"Kevin"]; 
NSArray *iqs = @[@110,@145,@75,@122,@130]; 

NSMutableArray *array = [NSMutableArray array]; 
for (int idx = 0;idx<[users count];idx++) { 
    NSDictionary *dict = @{@"Name": users[idx],@"IQ":iqs[idx]}; 
    [array addObject:dict]; 
} 

NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"IQ" ascending:NO]; 
[array sortUsingDescriptors:@[descriptor]];