NSSortDescriptor对可能为零的属性进行排序

时间:2015-11-05 19:27:08

标签: ios objective-c nsarray nssortdescriptor

我有一系列信标报告他们的距离,我正在一个具有既定架构的项目中工作,我无法改变,否则我可能有不同方法的选择。

现有的信标对象数组报告了它们的平均距离。现有代码按照平均距离对信标数组进行排序,存储在名为_averageDistance的属性中。一切都运行良好,直到离线信标报告一个零_averageDistance表示它不可用。

当前代码如下:

NSSortDescriptor* sortOnDistance = [NSSortDescriptor sortDescriptorWithKey:@"averageDistance" ascending:YES];
NSArray* sortDescriptors = [NSArray arrayWithObject:sortOnDistance];
NSArray* sortedBeacons = [allBeacons sortedArrayUsingDescriptors:sortDescriptors];

BOOL sameBeacon = NO;
if(![[sortedBeacons firstObject] isEqual:_closestBeacon]){
    _closestBeacon = (PTBeacon*)[sortedBeacons firstObject];
}
else {
    sameBeacon = YES;
}

在排序NSArray时,有没有办法控制处理nil值的方式?谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用不同的排序方法强制不可用的信标到最后:

#!/usr/bin/perl

use strict;
use warnings 'all';
use autodie;

my %conversion;

{
    open my $in_fh,  '<', '/scratch/Drosophila/fb_synonym_fb_2014_05.tsv';

    while ( <$in_fh> ) {
        chomp;

        my ($gene_id, $gene_symbol) = split /\t/;
        $conversion{$gene_id} = $gene_symbol if $gene_id =~ /^FBgn\d+/;
    }
}

{
    open my $in_fh,  '<', '/scratch/Drosophila/FlyRNAi_data_baseline_vs_EGF.txt';
    open my $out_fh, '>', 'FLYRNAi_data_baseline_vs_EGFSymbol.txt';

    while ( <$in_fh> ) {
        chomp;

        my ( $gene_id, $egf_baseline, $egf_stimulus ) = split /\t/;

        my $gene_symbol = $conversion{$gene_id} // 'NA';

        print $out_fh join("\t", $gene_id, $gene_symbol, $egf_baseline, $egf_stimulus), "\n";
    }
}

这使得[allBeacons sortedArrayUsingComparator:^(PTBeacon * firstBeacon, PTBeacon * secondBeacon){ if( ![firstBeacon averageDistance] ){ return (NSComparisonResult)NSOrderedAscending; } else { return [[firstBeacon averageDistance] compare:[secondBeacon averageDistance]]; } }]; averageDistance的任何信标比任何其他信标都要大,这与当前正在发生的信号相反。不可用的信标将以排序数组中的任何其他信标结束(以它们之间的任意顺序)。

或者您可以在排序之前过滤数组:

nil

这将导致NSPredicate * availabilityPredicate = [NSPredicate predicateWithFormat:@"averageDistance != NIL"]; NSArray * allAvailableBeacons = [allBeacons filteredArrayUsingPredicate:availabilityPredicate]; 仅包含allAvailableBeacons不是averageDistance的信标。然后,您可以对该数组进行排序,而不是原始数组。

答案 1 :(得分:0)

我会编写一个自定义NSSortDescriptor来处理你认为合适的nil值:

NSSortDescriptor* sortOnDistance = [NSSortDescriptor sortDescriptorWithKey:@"averageDistance"
                                            ascending:YES
                                           comparator:^NSComparisonResult(id obj1, id obj2)  {
                                               if(obj1 == nil){
                                                    //customize here
                                                    return NSOrderedDescending;
                                               }else if(obj2 == nil){
                                                    return NSOrderedAscending;
                                               }else{  
                                                    return [obj1 compare:obj2];}
                                               }];