Ios 对数组进行排序以获取与给定日期最近的日期

Ios 对数组进行排序以获取与给定日期最近的日期,ios,objective-c,sorting,nsarray,nsdate,Ios,Objective C,Sorting,Nsarray,Nsdate,该数组包含以下字典 NSArray *availableSlots = @[@{@"start" : <NSDate obj> , @"end" : <NSDate obj>}, @{@"start" : <NSDate obj> , @"end" : <NSDate obj>}, @{@"start" : <NSDate obj> , @"

该数组包含以下字典

NSArray *availableSlots = @[@{@"start" : <NSDate obj> , @"end" : <NSDate obj>},
                        @{@"start" : <NSDate obj> , @"end" : <NSDate obj>},
                        @{@"start" : <NSDate obj> , @"end" : <NSDate obj>},
                        @{@"start" : <NSDate obj> , @"end" : <NSDate obj>} ...];
NSArray*availableSlots=@[{@“开始”:、@“结束”:,
@{@“开始”:,@“结束”:},
@{@“开始”:,@“结束”:},
@{@“开始”:,@“结束”:}…];
我想获得与选定日期最近的开始和结束日期

下面是这个解决方案的js伪代码函数。我想把它转换成目标C

function sortByProximityToPoint(a, b) {
        if (a.proximToPoint === undefined) {
            if (pointInTime.diff(a.start, 'minute') >= 0 &&
                pointInTime.diff(a.end, 'minute') <= 0) {
                a.proximToPoint = 0;
            } else if (pointInTime.diff(a.end, 'minute') > 0) {
                a.proximToPoint = Math.abs(pointInTime.diff(a.end, 'minute'));
            } else {
                a.proximToPoint = Math.abs(pointInTime.diff(a.start, 'minute'));
            }
        }

        if (b.proximToPoint === undefined) {
            if (pointInTime.diff(b.start, 'minute') >= 0 &&
                pointInTime.diff(b.end, 'minute') <= 0) {
                b.proximToPoint = 0;
            } else if (pointInTime.diff(b.end, 'minute') > 0) {
                b.proximToPoint = Math.abs(pointInTime.diff(b.end, 'minute'));
            } else {
                b.proximToPoint = Math.abs(pointInTime.diff(b.start, 'minute'));
            }
        }

        if (a.proximToPoint < b.proximToPoint) {
            return -1;
        }
        if (a.proximToPoint > b.proximToPoint) {
            return 1;
        }

        return 0;
    }

    availableSlots.sort(sortByProximityToPoint);
函数sortByProximityToPoint(a,b){
if(a.proximToPoint==未定义){
如果(pointInTime.diff(a.start,'minute')>=0&&
pointInTime.diff(a.end,'minute')0){
a、 proximToPoint=Math.abs(pointInTime.diff(a.end,'minute'));
}否则{
a、 proximToPoint=Math.abs(pointInTime.diff(a.start,'minute'));
}
}
if(b.proximToPoint==未定义){
if(pointInTime.diff(b.start,'minute')>=0&&
点时间差(b.end,'minute')0){
b、 proximToPoint=Math.abs(pointInTime.diff(b.end,'minute'));
}否则{
b、 proximToPoint=Math.abs(pointInTime.diff(b.start,'minute'));
}
}
if(a.proximToPointb.proximToPoint){
返回1;
}
返回0;
}
availableSlots.sort(sortByProximityToPoint);
只是,即使我能理解JavaScript伪代码,不需要注释/解释,也需要更多的时间,有时用文字和示例来解释会更清楚。特别是对于可能有相同问题的人,快速查看这是否适合他/这里的问题

所以你不明白这个算法是做什么的,你想用英语而不是伪代码来解释吗

该函数是一个典型的比较函数,它返回三个值(
-1
0
+1
)中的一个,以指示其两个参数的顺序。在许多语言中都可以看到这种约定,Objective-C使用符号名(
nsoredascensing
等)而不是数字(但在引擎盖下,它们只是相同的三个数字)

前两部分生成一个数值,该数值适合于从每个提供的参数间隔进行比较。使用
S
表示间隔的开始时间,
E
表示结束时间,
P
表示与这些部分比较的时间点,可处理以下三种情况:

Time ->      P          S           E
p
在开始时间之前:返回时间差
S-p
。这是P与间隔的“距离”

Time ->      S          P           E
p
在间隔内:返回0

Time ->      S          E           P
p
在结束时间之后:返回时差
p-E
。这是P与间隔的“距离”

Time ->      S          P           E
现在,该算法有两个数字要比较,更小的意思是“更好”,这意味着排序的时间更早。因此,它比较这两个数字并返回指示顺序的适当值

在Objective-C中,您将使用块而不是函数,将其直接传递给
NSArray
的适当排序方法。日期时间比较和差异函数来自
NSDate

虽然可以实现与Javascript缓存“proxim”值(伪代码中的
未定义的
内容)等价的功能,但您应该将其保留到必要的时候。只需使用局部(块)变量

还要注意的是,绝对值函数的使用是不必要的——想想看

HTH

//对它们进行排序
NSArray*sortedArray=[可用批次使用比较器进行排序:^N比较结果(NSMutableDictionary*a,NSMutableDictionary*b){
如果(a[@“proximToPoint”]==[NSNull]){
如果([(NSDate*)a[@“开始”]比较:时间]!=传感器解除搜索和[(NSDate*)a[@“结束”]比较:时间]!=传感器解除搜索){
[a setObject:@0 forKey:@“proximToPoint”];
}如果([(NSDate*)a[@“end”]比较:时间]==nsoredascensing){
[a setObject:@(abs([(NSDate*)a[@“end”]比较:时间])forKey:@“proximToPoint”];
}否则{
[a setObject:@(abs([(NSDate*)a[@“start”]比较:时间])forKey:@“proximToPoint”];
}
}
如果(b[@“proximToPoint”]==[NSNull]){
如果([(NSDate*)b[@“开始”]比较:时间]!=传感器解除搜索和[(NSDate*)b[@“结束”]比较:时间]!=传感器解除搜索){
[b setObject:@0 forKey:@“proximToPoint”];
}else if([(NSDate*)b[@“end”]比较:时间]==nsoredascensing){
[b setObject:@(abs([(NSDate*)b[@“end”]比较:时间])forKey:@“proximToPoint”];
}否则{
[b setObject:@(abs([(NSDate*)b[@“start”]比较:时间])forKey:@“proximToPoint”];
}
}
如果(a[@“proximToPoint”]>b[@“proximToPoint”]){
返回(NSComparisonResult)或撤销;
}
如果(a[@“proximToPoint”]
NSDate
提供了比较和差异的方法,并且(Objective-)C中有一个abs函数,您到底有什么问题?我想获取点时间(所选日期)最近的可用地块。明白,您甚至有一些代码来完成。转换到Objective-C时,您在哪里被卡住了?(您可以编辑问题以显示此内容。)问题:起点/终点耦合值是否可以与另一个值相交?您是否需要找到正好在开始/结束耦合值范围内的开始/结束耦合?开始/结束耦合值是否可以在过去与日期进行比较,或者是否需要在将来?你真的需要排序,还是只需要找到最接近的两个值?@Larne-good questio