onorder详解

发布时间:2023-05-18

一、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)
}