0

arrayToFilter という myObjects の配列があります。myObject の 1 つ (要素?) はベジェパスの配列です。特定のインデックス (thispath) の bezierpath を 2 番目のパスと比較し、パスが一定量 (20%) 重複するオブジェクトのみで構成されるfilteredArray を作成しています。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 に基づいてその場で計算されるため、並べ替えられた配列メソッドの使用方法がわかりません。

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 : 配列をソートする簡単な方法の 1 つで、メソッドと同じようにブロックを使用し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 に答える