【问题标题】:sorted array from indexesOfObjectsPassingTest?从 indexOfObjectsPassingTest 排序的数组?
【发布时间】:2011-06-27 23:13:14
【问题描述】:

我有一个名为 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 排序出来的那些对象具有较高的重叠值首先出现。由于重叠是根据当前路径和此路径动态计算的,我不知道如何使用任何排序数组方法。

【问题讨论】:

    标签: ios sorting nsindexset


    【解决方案1】:

    您可以从创建包含路径和重叠数据的字典数组开始。这将需要对您当前通过过滤器搜索和提取的方法进行一些修改。

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

    【讨论】:

    • 我明白了。谢谢!我会尝试一下,看看是否有效。我最初忘了提到,与数组中的路径进行比较的路径是由用户输入的。但这似乎仍然可以使用您提供的代码。如果每次用户输入新路径进行比较时都替换保存重叠数据的字典,它是否仍然有效?我试试看……
    • 我不明白这可能是个问题,但如果结果是这样,请告诉我。请记住 sortedArray 是一个自动释放的对象,因此您可能必须根据需要保留它。
    • 到目前为止一切顺利。但是如何从 sortedArray 中检索项目?它似乎不是 myObjects 的数组,而是字典的数组?
    • 获取路径为MyObject * myObject = [[sortedArray objectAtIndex:idx] objectForKey:@"object"];
    【解决方案2】:

    您必须先对数组进行排序,然后调用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 执行现有过滤

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 1970-01-01
      • 2013-06-26
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多