2015-05-09 137 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