一、onordermap是什么
onordermap是指一个地图,它里面包含了多个订单(order)点的信息,可以用于快递的路线规划等场景。 onordermap的定义如下:
type OnOrderMap struct {
Orders []*Order // Order列表
}
其中Order的定义如下:
type Order struct {
ID string // 订单ID
Longitude float64 // 经度
Latitude float64 // 纬度
}
onordermap包含了多个订单点,所以在实际使用中,需要先初始化一个onordermap,然后将订单点添加到该地图当中,实例如下:
// 初始化onordermap
onOrderMap := &OnOrderMap{
Orders: make([]*Order, 0),
}
// 添加订单点到onordermap中
order1 := &Order{
ID: "1001",
Longitude: 116.403963,
Latitude: 39.915119,
}
onOrderMap.Orders = append(onOrderMap.Orders, order1)
order2 := &Order{
ID: "1002",
Longitude: 116.432048,
Latitude: 39.916185,
}
onOrderMap.Orders = append(onOrderMap.Orders, order2)
二、order是什么
order指订单点,包含了订单的ID以及所在的经纬度信息。 order的定义已在上述代码中给出,这里不再赘述。
三、onorder是什么
onorder是指一个订单序列,根据订单序列可以为快递员规划最优路径。 onorder的定义如下:
type OnOrder struct {
Map *OnOrderMap // 地图
OrderIndex []int // 订单序列
}
其中Map表示地图,OrderIndex表示订单序列,订单序列是指将onordermap中的订单按照顺序排列而成的一个序列,实例如下:
// 假设订单序列为order1->order2->order3
orderIndex := []int{0, 1, 2}
// 初始化onorder
onOrder := &OnOrder{
Map: onOrderMap,
OrderIndex: orderIndex,
}
通过onorder,可以根据订单序列对路线进行优化,这也是onorder的应用场景之一。
四、by order是什么
by order是指按照订单顺序将onordermap中的订单点进行排序。 在实际的业务开发中,我们需要根据订单的顺序来对快递员的路线进行规划,例如快递员需要按照A、B、C的顺序将货物送到三个地方,如果路线规划不当,可能会导致浪费时间和费用。 下面给出by order的代码实现:
// by order
type ByOrder []*Order
func (s ByOrder) Len() int { return len(s) }
func (s ByOrder) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s ByOrder) Less(i, j int) bool { return s[i].OrderIndex < s[j].OrderIndex }
// 对ondermap中的订单点按照顺序进行排序
func (o *OnOrderMap) SortByOrder(orderIndex []int) {
m := make(map[int]*Order)
for _, v := range o.Orders {
m[v.OrderIndex] = v
}
for i, v := range orderIndex {
if val, ok := m[i]; ok {
val.OrderIndex = i
o.Orders[v] = val
} else {
fmt.Println("wrong order index")
}
}
sort.Sort(ByOrder(o.Orders))
}
在使用by order前,需要先对order点进行排序,实例如下:
// 初始化一个地图
onOrderMap := &OnOrderMap{
Orders: make([]*Order, 0),
}
// 添加订单点
order1 := &Order{
ID: "1001",
Longitude: 116.403963,
Latitude: 39.915119,
OrderIndex: 1,
}
onOrderMap.Orders = append(onOrderMap.Orders, order1)
order2 := &Order{
ID: "1002",
Longitude: 116.432048,
Latitude: 39.916185,
OrderIndex: 2,
}
onOrderMap.Orders = append(onOrderMap.Orders, order2)
order3 := &Order{
ID: "1003",
Longitude: 116.414407,
Latitude: 39.908774,
OrderIndex: 0,
}
onOrderMap.Orders = append(onOrderMap.Orders, order3)
// 对订单点进行排序
onOrderMap.SortByOrder([]int{2, 0, 1})
在上述代码中,我们先初始化一个地图,然后添加三个订单点,最后按照指定顺序调用SortByOrder进行排序。
五、示例代码
以下是一个完整的示例代码:
package main
import (
"fmt"
"sort"
)
type OnOrderMap struct {
Orders []*Order // Order列表
}
type Order struct {
ID string // 订单ID
Longitude float64 // 经度
Latitude float64 // 纬度
OrderIndex int // 订单序号
}
type ByOrder []*Order
func (s ByOrder) Len() int { return len(s) }
func (s ByOrder) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s ByOrder) Less(i, j int) bool { return s[i].OrderIndex < s[j].OrderIndex }
type OnOrder struct {
Map *OnOrderMap // 地图
OrderIndex []int // 订单序列
}
func (o *OnOrderMap) SortByOrder(orderIndex []int) {
m := make(map[int]*Order)
for _, v := range o.Orders {
m[v.OrderIndex] = v
}
for i, v := range orderIndex {
if val, ok := m[i]; ok {
val.OrderIndex = i
o.Orders[v] = val
} else {
fmt.Println("wrong order index")
}
}
sort.Sort(ByOrder(o.Orders))
}
func main() {
// 初始化一个地图
onOrderMap := &OnOrderMap{
Orders: make([]*Order, 0),
}
// 添加订单点
order1 := &Order{
ID: "1001",
Longitude: 116.403963,
Latitude: 39.915119,
OrderIndex: 1,
}
onOrderMap.Orders = append(onOrderMap.Orders, order1)
order2 := &Order{
ID: "1002",
Longitude: 116.432048,
Latitude: 39.916185,
OrderIndex: 2,
}
onOrderMap.Orders = append(onOrderMap.Orders, order2)
order3 := &Order{
ID: "1003",
Longitude: 116.414407,
Latitude: 39.908774,
OrderIndex: 0,
}
onOrderMap.Orders = append(onOrderMap.Orders, order3)
// 对订单点进行排序
onOrderMap.SortByOrder([]int{2, 0, 1})
// 初始化onorder
onOrder := &OnOrder{
Map: onOrderMap,
OrderIndex: []int{0, 1, 2},
}
fmt.Printf("Order sequence: %v\n", onOrder.OrderIndex)
fmt.Printf("First order's longitude: %v\n", onOrder.Map.Orders[0].Longitude)
fmt.Printf("First order's latitude: %v\n", onOrder.Map.Orders[0].Latitude)
}