我有一系列信标报告他们的距离,我正在一个具有既定架构的项目中工作,我无法改变,否则我可能有不同方法的选择。
现有的信标对象数组报告了它们的平均距离。现有代码按照平均距离对信标数组进行排序,存储在名为_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值的方式?谢谢!
答案 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];}
}];