2015-05-09 110 views
0

该数组包含下面的字典。对数组进行排序以获取给定日期的最近日期

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>} ...]; 

我想获取离选定日期最近的开始日期和结束日期。

以下是此解决方案的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); 
+1

'NSDate'提供了比较和差异的方法,并且在(Objective-)C的ABS功能,你到底是有问题呢? – CRD

+0

我想为pointInTime(选定日期)获取最近的availableSlots。 –

+0

了解,你甚至有一些代码来做到这一点。转换为Objective-C时,卡住了哪里? (您可以编辑问题以显示此信息。) – CRD

回答

1

这只是,即使我能理解JavaScript的伪代码,没有注释/交代,它需要更多的时间,它有时更清晰的文字和例子来解释。特别是对于可能有同样问题的人,如果这适合他/他们的问题,可以很快看到。

所以你不明白算法做什么,并希望在英文而不是伪代码解释?

功能是一个典型的比较函数返回三个值中的一个(-10+1),以表明它的两个参数的顺序。你看在许多语言此约定,Objective-C中使用的符号名(NSOrderedAscending等等)而不是数字(但是它们就是三个数字)。

前两部分产生一个适合于从每个提供的参数区间进行比较的数值。使用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的“距离”。

现在算法有两个数字进行比较,较小的意思是“更好”,这意味着更早的排序。所以它比较两个数字并返回表示顺序的适当值。

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

尽管您可以实现与“proxim”值(undefined东西在伪代码中)的Javascript缓存等效的内容,但您应该保留该内容,直到发现它为止。只需使用本地(到块)变量。

还要注意绝对值函数的使用是不必要的 - 考虑一下。

HTH

+0

这是一个很好的解释CRD。我终于想出了Obj-c代码。希望我的回答对某人也有帮助 –

-1
// sort them 
NSArray *sortedArray = [availableSlots sortedArrayUsingComparator:^NSComparisonResult(NSMutableDictionary* a, NSMutableDictionary* b) { 

    if (a[@"proximToPoint"] == [NSNull null]) { 
     if ([(NSDate *)a[@"start"] compare:time] != NSOrderedDescending && [(NSDate *)a[@"end"] compare:time] != NSOrderedAscending) { 
      [a setObject:@0 forKey:@"proximToPoint"]; 
     } else if ([(NSDate *)a[@"end"] compare:time] == NSOrderedAscending){ 
      [a setObject:@(abs([(NSDate *)a[@"end"] compare:time])) forKey:@"proximToPoint"]; 
     } else { 
      [a setObject:@(abs([(NSDate *)a[@"start"] compare:time])) forKey:@"proximToPoint"]; 
     } 
    } 

    if (b[@"proximToPoint"] == [NSNull null]) { 
     if ([(NSDate *)b[@"start"] compare:time] != NSOrderedDescending && [(NSDate *)b[@"end"] compare:time] != NSOrderedAscending) { 
      [b setObject:@0 forKey:@"proximToPoint"]; 
     } else if ([(NSDate *)b[@"end"] compare:time] == NSOrderedAscending){ 
      [b setObject:@(abs([(NSDate *)b[@"end"] compare:time])) forKey:@"proximToPoint"]; 
     } else { 
      [b setObject:@(abs([(NSDate *)b[@"start"] compare:time])) forKey:@"proximToPoint"]; 
     } 
    } 

    if (a[@"proximToPoint"] > b[@"proximToPoint"]) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 

    if (a[@"proximToPoint"] < b[@"proximToPoint"]) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 

    return (NSComparisonResult)NSOrderedSame; 
}]; 
+0

对不起,但这个答案没有实现算法,它也不起作用。 proximToPoint值总是为0(插槽内的点)或1(插槽外的点)。再次阅读我对算法的解释。您还通过在排序开始之前要求所有要排序的元素是可变字典*和*具有值“[NSNull null]”的键“proximToPoint”来模拟Javascript动态添加属性的能力。您的答案不包括执行此操作的代码;你不需要做这种缓存,但是如果你这样做,你能不会想到更好的方法? – CRD

相关问题