Ich würde eine neue Klasse ItemGroup
, und fügen Sie dann eine zusätzliche Ivar genannt group
zu Ihrem Artikel Klasse namens erstellen:
@interface ItemGroup : NSObject
{
NSNumber * time;
}
@property (nonatomic, copy) time;
@end
@interface ItemClass : NSobject
{
NSString * name;
NSNumber * time;
ItemGroup * group;
}
@property (nonatomic, copy) NSString * name;
@property (nonatomic, copy) NSNumber * time;
@property (nonatomic, assign) ItemClass * group; // note: must be assign
@end
Dann könnten Sie Folgendes tun:
NSMutableDictionary * groups = [NSMutableDictionary dictionaryWithCapacity:0];
for (ItemClass * item in sourceData)
{
ItemGroup * group = [groups objectForKey:item.name];
if (group == nil)
{
group = [[ItemGroup alloc] init];
[groups setObject:group forKey:item.name];
[group release];
group.time = item.time;
}
else if (item.time < group.time)
{
group.time = item.time;
}
item.group = group;
}
Dieser Code Durchläuft das unsortierte Array und protokolliert die Mindestzeit für jede Gruppe sowie die Gruppe für jeden Eintrag. Mit diesen komplett Sie einfach Art auf group.time
und time
:
NSSortDescriptor * groupSorter;
groupSort = [NSSortDescriptor sortDescriptorWithKey:@"group.time" ascending:YES];
NSSortDescriptor * timeSorter;
timeSort = [NSSortDescriptor sortDescriptorWithKey:@"time" ascending:YES];
NSArray * sortDescriptors = [NSArray arrayWithObjects:groupSort, timeSort, nil];
NSArray * sorted = [sourceData sortedArrayUsingDescriptors:sortDescriptors];
Und das sollte es tun!
UPDATE: Beachten Sie, dass Sie viel bessere Leistung erhalten können, wenn Sie die Gruppen direkt aus dem Tor zuordnen konnten. Etwas wie folgt aus:
@interface ItemGroup : NSObject
{
NSString * name;
NSNumber * time;
}
@property (nonatomic, copy) NSString * name;
@property (nonatomic, copy) NSSNumber * time;
@end
@interface ItemClass : NSObject
{
ItemGroup * group;
NSNumber * time;
}
@property (nonatomic, retain) ItemGroup * group;
@property (nonatomic, copy) NSNumber * time;
@end
Nun, wenn Sie eine Liste der Gruppen irgendwo halten (sie sogar irgendwo in einem Array gehen könnte, wenn es sein muss):
ItemGroup * group_A = [[ItemGroup alloc] init];
group_A.name = @"A";
ItemGroup * group_B = [[ItemGroup alloc] init];
group_B.name = @"B";
...
und stattdessen die Namen der Einstellung Ihrer Datenelemente, stellen Sie ihre Gruppe:
someItem.group = group_A;
someItem.time = GetSomeRandomTimeValue();
[sourceData addObject:someItem];
....
Dies würde die Schleife erheblich vereinfachen verwendet Gruppe Zeiten einzustellen:
for (ItemClass * item in sourceData)
{
if (item.time < group.time) { group.time = item.time; }
}
Und wenn Sie wirklich darüber sein lodernden schnell wollte, man konnte sogar die Eigenschaft Setter für Ihre time
Eigenschaft ändern, um die Gruppe mal on the fly zu setzen:
@implementation ItemClass
- (void)setTime:(NSNumber *)newTime
{
if (newTime < group.time) { group.time = newTime; }
time = [newTime copy];
}
@end
Beachten Sie, dass Sie müssten sicher sein, dass group
eingestellt wurde, bevor Sie die Uhrzeit einstellen. Damit wäre diese Sortierschleife überhaupt nicht nötig. Die sortDescriptors wären ausreichend.
Das beantwortet die Frage nicht: Meine Situation ist komplizierter als einfach nach Namen zu sortieren. – Jaanus
@Jaanus. Ohhh ich sehe. Ich habe nicht bemerkt, dass die Reihenfolge der Gruppen von der Zeit abhängt. –
@Jaanus. Ich habe den Code aktualisiert, damit er die Frage beantwortet! –