zhangzengfei
2024-10-20 c1d32ecdb36d7365a660ae2cf1405e1ca1898b4b
优化楼层查找
1个文件已修改
70 ■■■■ 已修改文件
nvcs/cache.go 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
nvcs/cache.go
@@ -112,66 +112,68 @@
}
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