对包含NSRange值的数组进行排序

时间:2014-04-25 15:37:22

标签: ios objective-c

有一个包含一些NSRange值的数组:

@[[NSVale valueWithRange:{5,3}],[NSVale valueWithRange:{2,3}],[NSVale valueWithRange:{7,3}],[NSVale valueWithRange:{1,3}],....]

每个range都有不同的location,我希望数组按range.location按逆序排序,任何好的解决方案?

4 个答案:

答案 0 :(得分:6)

sortedArrayUsingComparator:是您完成任务的最佳选择。

您的案例代码是:

NSArray *array = @[[NSValue valueWithRange:NSMakeRange(5,3)],
                   [NSValue valueWithRange:NSMakeRange(2,3)],
                   [NSValue valueWithRange:NSMakeRange(7,3)],
                   [NSValue valueWithRange:NSMakeRange(1,3)]];

array = [array sortedArrayUsingComparator:^NSComparisonResult(NSValue *value1, NSValue *value2) {
        NSComparisonResult result = NSOrderedSame;
        if (value1.rangeValue.location > value2.rangeValue.location) {
            result = NSOrderedAscending;
        } else if (value1.rangeValue.location < value2.rangeValue.location) {
            result = NSOrderedDescending;
        }
        return result;
}];

答案 1 :(得分:2)

Visput显示如何使用比较器按相反顺序对数组进行排序。虽然该代码有效但它有一个缺点:他通过返回NSOrderedDescending x&lt;&lt; y,NSOrderedAscending表示x&gt;但这实际上令人困惑,因为这与数学和自然告诉我们的相反。如果您只是排序一次可能没问题,但如果重新使用比较器,可能会让人感到困惑,特别是如果您希望能够切换升序和降序。

所以我建议保持关系<>的自然顺序并反转排序的数组。使用[[array reverseObjectEnumerator] allObjects]

可以轻松地反转数组

这里有两个订单的比较器块。

NSArray *array = @[[NSValue valueWithRange:NSMakeRange(5,3)],
                   [NSValue valueWithRange:NSMakeRange(2,3)],
                   [NSValue valueWithRange:NSMakeRange(7,3)],
                   [NSValue valueWithRange:NSMakeRange(1,3)]];

NSComparator compr = ^NSComparisonResult(NSValue *value1, NSValue *value2) {
    NSComparisonResult result = NSOrderedSame;
    if (value1.rangeValue.location < value2.rangeValue.location) {
        result = NSOrderedAscending;
    } else if (value1.rangeValue.location > value2.rangeValue.location) {
        result = NSOrderedDescending;
    }
    return result;
};


NSArray *descArray = [[[array sortedArrayUsingComparator:compr] reverseObjectEnumerator] allObjects];
NSArray *ascArray = [array sortedArrayUsingComparator:compr];

NSLog(@"descending\n%@\n\nascending\n%@", descArray, ascArray);;

结果:

descending
(
    "NSRange: {7, 3}",
    "NSRange: {5, 3}",
    "NSRange: {2, 3}",
    "NSRange: {1, 3}"
)

ascending
(
    "NSRange: {1, 3}",
    "NSRange: {2, 3}",
    "NSRange: {5, 3}",
    "NSRange: {7, 3}"
)

答案 2 :(得分:1)

使用-[NSArray sortedArrayUsingComparator:(NSComparator)cmptr]。比较器是一个将占用2个对象的块(如果使用数组,则为NSValues)。比较器的结果定义了输出数组的顺序。

答案 3 :(得分:0)

使用NSArray的方法sortedArrayUsingComparatorhttps://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/classes/NSArray_Class/NSArray.html#//apple_ref/occ/instm/NSArray/sortedArrayUsingComparator :)处的文档,无论何种类型,都可以对任何数组进行排序。基本上,如果第二个值的位置较高,则会传入一个返回NSOrderedAscending的块,反之亦然。

希望这有帮助!