我有一个名为arrayToFilter的myObjects数组。 myObject的一个(元素?)是一个bezierpaths数组。我将特定索引(thispath)的bezierpath与第二个路径进行比较,并使filteredArray仅由路径重叠一定量(20%)的那些对象组成。我使用indexedOfObjectsPassingTest来这样:
NSIndexSet * index = [[arrayToFilter objectsAtIndexes:index] indexesOfObjectsPassingTest:^BOOL (id obj, NSUInteger idx, BOOL *stop){
MyObject * anobject = obj;
UIBezierPath * thispath = [anobject.allPaths objectAtIndex:i];
NSInteger overlap = [self percentPathBoxOverlap:path: thispath];
return overlap>20;
}];
if ([index count] !=0){
filteredArray = [arrayToFilter objectsAtIndexes:index] ;
}
这很好用。但我想做的是使用filteredArray排序,这些对象首先出现重叠值较高的对象。由于重叠是基于当前路径和thispath动态计算的,我不知道如何使用任何已排序的数组方法。
答案 0 :(得分:3)
您可以通过创建包含路径和重叠数据的字典数组来开始。这将需要对您当前搜索和提取过滤器的方法进行一些修改。
NSMutableArray * searchResults = [NSMutableArray array];
[arrayToSearch enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
MyObject * anobject = obj;
UIBezierPath * thispath = [anobject.allPaths objectAtIndex:i];
NSInteger overlap = [self percentPathBoxOverlap:path: thispath];
if ( overlap > 20 ) {
NSMutableDictionary * dictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:anObject, @"object", [NSNumber numberWithInteger:overlap], @"overlap", nil];
[searchResults addObject:dictionary];
}
}];
现在,您可以使用词典的overlap
键对此数组进行排序。
NSSortDescriptor * descriptor = [NSSortDescriptor sortDescriptorWithKey:@"overlap" ascending:NO];
NSArray * sortedArray = [searchResults sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];
现在sortedArray
将包含路径和重叠信息的排序列表。
答案 1 :(得分:0)
您必须先对数组进行排序,然后为排序的索引调用indexesOfObjectsPassingTest
。 sortedArrayUsingComparator:是一种比较简单的数组排序方法,它就像indexesOfObjectsPassingTest
方法一样需要一个块。
NSArray arrayToFilter = [originalArray sortedArrayUsingComparator: ^(id a, id b)
{
if (a.someValue > b.someValue) return NSOrderedAscending;
if (a.someValue < b.someValue) return NSOrderedDescending;
return NSOrderedSame;
}];
然后,您可以在arrayToFilter