onorder詳解

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-11 17:13
下一篇 2024-12-11 17:13

相關推薦

  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性感測器,能夠同時測量加速度和角速度。它由三個感測器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web伺服器。nginx是一個高性能的反向代理web伺服器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • C語言貪吃蛇詳解

    一、數據結構和演算法 C語言貪吃蛇主要運用了以下數據結構和演算法: 1. 鏈表 typedef struct body { int x; int y; struct body *nex…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變數讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25

發表回復

登錄後才能評論