0

我有一个名为arrayToFilter 的myObjects 数组。myObject 的一个(元素?)是一个贝塞尔路径数组。我将特定索引 (thispath) 处的 bezierpath 与第二条路径进行比较,并使过滤数组仅由路径重叠一定量 (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 排序出来的那些对象具有较高的重叠值首先出现。由于重叠是根据当前路径和此路径动态计算的,我不知道如何使用任何排序数组方法。

4

2 回答 2

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将有路径和重叠信息的排序列表。

于 2011-06-27T23:56:17.933 回答
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

于 2011-06-27T23:25:51.327 回答