2016-08-04 21 views
0

Ich habe 2 verschiedene NSArray mit benutzerdefinierten Objekten wie folgt,Sortieren NSArray benutzerdefinierte Objekte von einem anderen NSArray benutzerdefinierte Objekte

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"}]; 

Jetzt möchte ich meine items Array auf specList Array sortieren, basierend von „number“ Eigenschaft zu vergleichen.

Jetzt Liste meiner erwarteten Einzelteil ist,

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

Ich habe durch mehrere Proben gegangen, wie unten aufgeführt, aber ich konnte nicht herausfinden, wie man mit benutzerdefinierten Objekten zu vergleichen. Jede Hilfe würde geschätzt werden, Vielen Dank im Voraus.

Sample 1 Sample 2

Antwort

0

Diese den Trick tun sollten:

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); 

mit:

-(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 
} 
Ausgabe

:

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" 
) 

I -description außer Kraft setzen, um sich einzuloggen deutlicher:

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

Mit anderen Worten:
Sie haben den Index des entsprechenden Item Objekt innerhalb specList zu finden (siehe indexForItem:inList:) . Ich benutzte integerValue, weil Sie @"002" und @ "2" verwenden, die nicht gleiche Zeichenfolgen sind.
Dann in der NSComparator vergleichen Sie die beiden Indizes.

Für item1 und item5, die am Ende sind, lasse ich sie als ob. Es gibt keine Garantie für ihre Bestellung, da sie in specList nicht vorhanden sind. Wenn Sie sie in "aufsteigender" Reihenfolge setzen möchten, müssen Sie stattdessen tun:

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

Danke @Larme es funktioniert :) –

-1

Hier ist ein Beispiel für zweite Array Sortierung zum ersten verweisen:

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]];