如果我有2个NSMutableArrays并且我想要按照另一个的顺序排序一个,我将如何使用比较块执行此操作?第二个数组是由custom objects
组成的列表,其中包含一个名为name
["Alpha","Gamma","Beta","Delta"] // Order I want
[CustomObj1,CustomObj2,CustomObj3,CustomObj4]; // Order given
CustomObj1.name = "Alpha", CustomObj2.name = "Beta", ... CustomObj4.name = "Gamma"
答案 0 :(得分:1)
以下是您首选订单中的名称:
NSArray *order = @[@"Alpha",@"Gamma",@"Beta",@"Delta"];
这是未排序项目的数组:
NSArray *items = ...;
首先,制作一个字典,将每个名称映射到其首选位置:
NSMutableDictionary *rankings = [NSMutableDictionary dictionaryWithCapacity:order.count];
[order enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
rankings[obj] = @(idx);
}];
然后,通过在排名中查找每个项目的名称来对项目进行排序:
NSArray *sortedItems = [items sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
CustomObject *item1 = obj1;
CustomObject *item2 = obj2;
return [rankings[item1.name] compare:rankings[item2.name]];
}];
答案 1 :(得分:1)
我会这样做:
NSArray * customOrderStrings = @["Alpha","Gamma","Beta","Delta"];
NSArray * givenOrder = [CustomObj1,CustomObj2,CustomObj3,CustomObj4];
NSMutableDictionary * customOrderDict = [NSMutableDictionary dictionaryWithCapacity:customOrder.count];
for(CustomObject * co in customOrder)
{
customOrderDict[co.name] = co;
}
NSMutableArray * customOrder = [NSMutableArray arrayWithCapacity:givenOrder.count];
for(NSString * name in customOrderStrings)
{
[customOrder addObject:customOrderDict[name]];
}
假设: customOrderStrings中的项目是唯一的。 customOrderStrings中的项目与givenOrder中的项目1:1对应。