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/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

发表回复

登录后才能评论