| | |
| | | } |
| | | |
| | | func (c *simpleCache) getPositionByTime(timestamp int64) (runData ElevatorRunData) { |
| | | node := c.data.Back() |
| | | node := c.data.Back() // 从链表尾部开始 |
| | | if node == nil { |
| | | return |
| | | } |
| | | |
| | | for { |
| | | if node.Prev() == nil { |
| | | break |
| | | } |
| | | |
| | | if node.Prev().Value.(ElevatorRunData).Timestamp >= timestamp { |
| | | node = node.Prev() |
| | | for node != nil { |
| | | if data, ok := node.Value.(ElevatorRunData); ok { |
| | | if data.Timestamp >= timestamp { |
| | | runData = data |
| | | node = node.Prev() // 向前移动节点 |
| | | } else { |
| | | break |
| | | } |
| | | } else { |
| | | break |
| | | } |
| | | } |
| | | |
| | | if node.Value.(ElevatorRunData).Timestamp >= timestamp { |
| | | runData = node.Value.(ElevatorRunData) |
| | | } |
| | | |
| | | return |
| | | } |
| | | |
| | | func (c *simpleCache) getMovePosition(timestamp int64, floor string) (runData ElevatorRunData) { |
| | | node := c.data.Back() |
| | | node := c.data.Back() // 从链表末尾开始 |
| | | if node == nil { |
| | | return |
| | | } |
| | | |
| | | // 先找到最近节点 |
| | | for { |
| | | if node.Prev() == nil { |
| | | break |
| | | } |
| | | |
| | | if node.Prev().Value.(ElevatorRunData).Timestamp >= timestamp { |
| | | node = node.Prev() |
| | | // 找到最近的符合时间戳的节点 |
| | | for node != nil { |
| | | if data, ok := node.Value.(ElevatorRunData); ok { |
| | | if data.Timestamp >= timestamp { |
| | | node = node.Prev() // 向前移动节点 |
| | | } else { |
| | | break |
| | | } |
| | | } else { |
| | | break |
| | | } |
| | | } |
| | | |
| | | if node.Value.(ElevatorRunData).Timestamp >= timestamp { |
| | | for { |
| | | if node.Next() == nil { |
| | | break |
| | | // 如果找到的节点的时间戳符合要求,继续检查楼层 |
| | | if node != nil { |
| | | if current, ok := node.Value.(ElevatorRunData); ok && current.Timestamp >= timestamp { |
| | | for node != nil { |
| | | if nextNode := node.Next(); nextNode != nil { |
| | | if nextData, ok := nextNode.Value.(ElevatorRunData); ok { |
| | | if nextData.Floor == floor { |
| | | node = nextNode // 向前移动节点 |
| | | } else { |
| | | break |
| | | } |
| | | } |
| | | } else { |
| | | break |
| | | } |
| | | } |
| | | |
| | | if node.Next().Value.(ElevatorRunData).Floor == floor { |
| | | node = node.Next() |
| | | } else { |
| | | break |
| | | // 如果找到的楼层与目标楼层不同,返回该数据 |
| | | if current.Floor != floor { |
| | | runData = current |
| | | } |
| | | } |
| | | } |
| | | |
| | | if node.Value.(ElevatorRunData).Timestamp >= timestamp && |
| | | node.Value.(ElevatorRunData).Floor != floor { |
| | | runData = node.Value.(ElevatorRunData) |
| | | } |
| | | |
| | | return |