отсортированный массив из indexOfObjectsPassingTest? - PullRequest
0 голосов
/ 28 июня 2011

У меня есть массив myObjects, который называется arrayToFilter. Один (элемент?) MyObject - это массив безье-путей. Я сравниваю bezierpath по определенному индексу (thispath) со вторым путем и делаю FilterArray, состоящий только из тех объектов, в которых пути перекрывают определенное количество (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] ;
    }

Это отлично работает. Но то, что я хотел бы сделать, это, чтобы FilterArray вышел отсортированным с теми объектами с более высоким значением перекрытия, выходящим первым. Поскольку перекрытие вычисляется на лету на основе текущего пути и этого пути, я не знаю, как использовать какой-либо из методов отсортированного массива.

Ответы [ 2 ]

3 голосов
/ 28 июня 2011

Вы можете начать с создания массива словарей, содержащих как пути, так и данные перекрытия.Это потребует некоторой модификации вашего текущего подхода, когда вы будете искать и извлекать через фильтр.

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 словарей.* Теперь sortedArray будет иметь отсортированный список информации о пути и перекрытии.

0 голосов
/ 28 июня 2011

Сначала нужно отсортировать массив, затем вызвать 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

...