Ios 未调用NSComparator块
我使用Ios 未调用NSComparator块,ios,objective-c-blocks,nssortdescriptor,Ios,Objective C Blocks,Nssortdescriptor,我使用NSFetchRequest从核心数据存储中提取数据,并将数据存储在数组中——所有这些都非常有效。作为下一步,我想使用NSSortDescriptors对数组进行排序,如下所示: array = [array sortedArrayUsingDescriptors:[NSArray arrayWithObjects: [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:NO],
NSFetchRequest
从核心数据
存储中提取数据,并将数据存储在数组中
——所有这些都非常有效。作为下一步,我想使用NSSortDescriptors
对数组进行排序,如下所示:
array = [array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:
[NSSortDescriptor sortDescriptorWithKey:@"score" ascending:NO],
[NSSortDescriptor sortDescriptorWithKey:@"score" ascending:NO comparator:^NSComparisonResult(id obj1, id obj2) {
if ([[[array objectAtIndex:[obj2 integerValue]] valueForKey:@"lessImportantItems"] containsObject:[array objectAtIndex:[obj1 integerValue]]]) {
return (NSComparisonResult)NSOrderedAscending;
} else {
return (NSComparisonResult)NSOrderedDescending;
}
}],
[NSSortDescriptor sortDescriptorWithKey:@"createdAt" ascending:NO], nil]];
我遇到的问题是没有调用第二个nssortddescriptor
中的NSComparator
块(我尝试NSLog
)。为了给我的数据结构提供一些背景信息,下面是相关的核心数据
对象图部分:
应用程序所做的是将项目相互比较。作为第一步,配对比较中的获胜者获得分数
增量。但我也标记了一个配对优先级,即我添加了一对多lessImportantItems
从胜利者到失败者的关系。因此,在我的数组中,我首先尝试按score
排序,然后,当score
s相等时,我也尝试按成对优先级排序
可能是因为我连续两次使用score
作为比较器key
?但是,另一方面,NSComparator
也不允许将关系
作为键传递
我似乎无法破解这个。有人有什么想法吗?或者我应该采取不同的排序方法?第二个排序描述符对我来说没有任何意义。它适用于给定的比较器
添加到要比较的对象的得分
属性。所以在比较器内部,
obj1
,obj2
是待比较对象的得分值。
似乎您试图使用
[array objectAtIndex:[obj1 integerValue]]
[array objectAtIndex:[obj2 integerValue]]
但这是行不通的。因此,第二个排序描述符应该如下所示
[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO
comparator:^NSComparisonResult(Item *item1, Item *item2) {
// compare item1, item2 ...
}];
但接下来的问题是:如何根据优先级比较两个对象?
您的代码基本上执行以下操作:
if ([item2 valueForKey:@"lessImportantItems"] containsObject:item1]) {
return NSOrderedAscending;
} else {
return NSOrderedDescending;
}
但这不是一个合适的比较标准:
- 如果对象相等(非“自反”),则不返回
- 对于两个“不相关的对象”,它将返回
sensorderescending
,而不考虑
订单(非“不对称”)
- 它不会检测
item1
是否仅与item2
间接相关(不是
“及物性”)
但如何对“无关对象”进行排序?没有唯一的解决方案。如果B和C都是
不如A重要,那么A,B,C和A,C,B都是有效的解决方案。
比较B和C时,比较器应该返回什么
所以我认为用排序描述符和
您必须选择其他算法,例如..第二个排序描述符对我来说没有任何意义。它适用于给定的比较器
添加到要比较的对象的得分
属性。所以在比较器内部,
obj1
,obj2
是待比较对象的得分值。
似乎您试图使用
[array objectAtIndex:[obj1 integerValue]]
[array objectAtIndex:[obj2 integerValue]]
但这是行不通的。因此,第二个排序描述符应该如下所示
[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO
comparator:^NSComparisonResult(Item *item1, Item *item2) {
// compare item1, item2 ...
}];
但接下来的问题是:如何根据优先级比较两个对象?
您的代码基本上执行以下操作:
if ([item2 valueForKey:@"lessImportantItems"] containsObject:item1]) {
return NSOrderedAscending;
} else {
return NSOrderedDescending;
}
但这不是一个合适的比较标准:
- 如果对象相等(非“自反”),则不返回
- 对于两个“不相关的对象”,它将返回
sensorderescending
,而不考虑
订单(非“不对称”)
- 它不会检测
item1
是否仅与item2
间接相关(不是
“及物性”)
但如何对“无关对象”进行排序?没有唯一的解决方案。如果B和C都是
不如A重要,那么A,B,C和A,C,B都是有效的解决方案。
比较B和C时,比较器应该返回什么
所以我认为用排序描述符和
您必须选择其他算法,例如..如果有人感兴趣,下面是我如何实现所需排序的
我只使用了上面示例中的第一个nssortddescriptor
来获得按分数排序的数组
,然后我调用了该数组
的进一步排序方法:
array = [array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:
[NSSortDescriptor sortDescriptorWithKey:@"score" ascending:NO], nil];
array = [self applyMoreImportantPairOrdering:array];
方法如下:
+ (NSArray *)applyMoreImportantPairOrdering:(NSArray *)array {
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:array];
[array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([[obj valueForKey:@"score"] integerValue] > 0) {
NSMutableSet *lessImportantItemsSet = [NSMutableSet setWithSet:[obj valueForKey:@"lessImportantItems"]];
for (int i = idx - 1; i >= 0; i--) {
NSManagedObject *objAbove = [array objectAtIndex:i];
if ([[obj valueForKey:@"score"] integerValue] == [[objAbove valueForKey:@"score"] integerValue]) {
if ([lessImportantItemsSet containsObject:objAbove]) {
NSUInteger idxAbove = [mutableArray indexOfObject:objAbove];
[mutableArray removeObject:obj];
[mutableArray insertObject:obj atIndex:idxAbove];
}
}
}
}
}];
return [NSArray arrayWithArray:mutableArray];
}
我之所以需要lessImportantItems集
,是因为当我在数组
中移动(删除和插入)一个项
时,它会丢失它的lessImportantItems
关系。这样,当我处理完特定的项目时,我会维护不太重要的项目的列表/集合
如果有人感兴趣,下面是我如何实现我所追求的排序
我只使用了上面示例中的第一个nssortddescriptor
来获得按分数排序的数组
,然后我调用了该数组
的进一步排序方法:
array = [array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:
[NSSortDescriptor sortDescriptorWithKey:@"score" ascending:NO], nil];
array = [self applyMoreImportantPairOrdering:array];
方法如下:
+ (NSArray *)applyMoreImportantPairOrdering:(NSArray *)array {
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:array];
[array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([[obj valueForKey:@"score"] integerValue] > 0) {
NSMutableSet *lessImportantItemsSet = [NSMutableSet setWithSet:[obj valueForKey:@"lessImportantItems"]];
for (int i = idx - 1; i >= 0; i--) {
NSManagedObject *objAbove = [array objectAtIndex:i];
if ([[obj valueForKey:@"score"] integerValue] == [[objAbove valueForKey:@"score"] integerValue]) {
if ([lessImportantItemsSet containsObject:objAbove]) {
NSUInteger idxAbove = [mutableArray indexOfObject:objAbove];
[mutableArray removeObject:obj];
[mutableArray insertObject:obj atIndex:idxAbove];
}
}
}
}
}];
return [NSArray arrayWithArray:mutableArray];
}
我之所以需要lessImportantItems集
,是因为当我在数组
中移动(删除和插入)一个项
时,它会丢失它的lessImportantItems
关系。这样,当我处理完特定的项目时,我会维护不太重要的项目的列表/集合
s,所以您想要的最终结果是对项目进行排序?无论如何?或者是你的一个变体?嗯,就像排序描述符所说的:(1)按分数排序,然后(2)如果分数相等,则按更重要的一对一排序,最后(3)按创建的日期排序(实际上与尾部的项目相关,即那些分数相等的项目-尚未比较)。这就是你要问的吗?所以你想要的最终结果是对项目进行排序?无论如何?或者是你的一个变体?就像排序描述符所说的:(1)按分数排序,然后(2)如果分数相等,则按更重要的一对一排序,最后(3)按创建日期排序(实际上,将与尾部的项目相关,即那些具有相同s的项目)