【发布时间】:2019-10-18 20:19:30
【问题描述】:
我有一个算法,它在从 Midnight->Midnight 运行的时间线上检查 Event (StartTime,EndTime) 的数组,以检查是否存在任何间隙。该算法有效,但有一种配置无效。
在我展示代码之前,这里是它不起作用的特定情况:当我有一个午夜结束事件,其 StartTime 与另一个未在午夜结束的事件相同。这里的问题是我在结果中添加了错误的 GAP,GAP (Midnight,Midnight)。 它不应该出现在我的结果中。
现在代码:所有事件(包括 GAP 事件)都有一个 (StartTime,EndTime)。我收到一个正常的proposedEvents 传入数组,我的工作是返回一个填充的preparedGapEvents 数组。
function schedulerPrepareGapEvents(proposedEvents) {
var preparedGapEvents = [];
// First sort proposed events by StartTime
proposedEvents.sort(sortObjectsByStartTime); // sort by StartTime of the event
// If there are no proposed events, exit immediately with an empty result
if (proposedEvents.length == 0) {
return preparedGapEvents;
}
// Manually add first gap, if it exists: Sorted Proposed Event #1 not starting at 12:00am
var startTimeFirst = getTimestampFromString(proposedEvents[0].startTime);
if (startTimeFirst > 0) {
preparedGapEvents.push({"gapEventID" : "event-GAP" + generateUniqueID(),
"gapEventColor" : globalGapEventColor,
"gapEventStartTimestamp" : 0,
"gapEventEndTimestamp" : startTimeFirst});
}
// Initially lastMaxEndTime is the End Time of 1st Event
var lastMaxEndTime = getTimestampFromString(proposedEvents[0].endTime);
// Main Event Traversal Loop
jQuery.each(proposedEvents, function(index, item) {
// Get the current proposed event's StartTime/EndTime in the loop
var startTimeCurrent = getTimestampFromString(item.startTime);
var endTimeCurrent = getTimestampFromString(item.endTime);
// Next neighboring proposed event
var nextEvent = proposedEvents[index+1];
// If Next Proposed Event exists
if (nextEvent != null) {
var startTimeNext = getTimestampFromString(nextEvent.startTime);
var endTimeNext = getTimestampFromString(nextEvent.endTime);
if (startTimeNext > lastMaxEndTime) { // Gap detected!
preparedGapEvents.push({"gapEventID" : "event-GAP" + generateUniqueID(),
"gapEventColor" : globalGapEventColor,
"gapEventStartTimestamp" : lastMaxEndTime,
"gapEventEndTimestamp" : startTimeNext});
}
// Keep track of the current MAX EndTime: either this new event's EndTime or the previous Max EndTime
lastMaxEndTime = Math.max(lastMaxEndTime, endTimeNext);
}
else {
// Last Proposed Event (no next neighbor): its End Time must be at the 24-hr END mark, otherwise a gap
if (endTimeCurrent < 1440) {
preparedGapEvents.push({"gapEventID" : "event-GAP" + generateUniqueID(),
"gapEventColor" : globalGapEventColor,
"gapEventStartTimestamp" : lastMaxEndTime,
"gapEventEndTimestamp" : 1440});
}
}
});
return preparedGapEvents;
这里的问题出在主循环的某个地方。在我按StartTime 排序后,两个相邻的事件可以在位置 0 或 1,取决于机会。假设碰巧我有一个处于 +1 位置的邻居,我将对其进行检查。在这种情况下,我属于 ELSE,并且满足条件if (endTimeCurrent < 1440),因为该事件的结束时间不是 1440(午夜)!
那么我该如何解决这个问题?
【问题讨论】:
标签: javascript algorithm sorting