一、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)
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/234092.html