从indicesOfObjectsPassingTest排序的数组?

时间:2011-06-27 23:13:15

标签: ios sorting nsindexset

我有一个名为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动态计算的,我不知道如何使用任何已排序的数组方法。

2 个答案:

答案 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)

您必须先对数组进行排序,然后为排序的索引调用indexesOfObjectsPassingTestsortedArrayUsingComparator:是一种比较简单的数组排序方法,它就像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

上执行现有过滤