在Go中对数组进行排序和比较

时间:2017-11-17 16:03:46

标签: sorting go comparison

我是初学者Go学生,我已经获得了以下需要在Go中构建的作业:
- 在一个包含密歇根州83个县和每个县城坐标(十进制)的数据文件中 - 设置我参加的大学的起始坐标。 - 提示方向(n,s,e,w)的用户,然后程序找到该指定方向上最近的县城。找到的县城然后成为新的起点,程序从方向提示开始。
- 如果用户遇到水或即将离开该状态,程序需要显示错误。

我能够毫无问题地完成大部分工作,但这里是我碰到砖墙的地方: 我的计划是使用两个数组;一个用于纬度,一个用于经度。我需要对每个阵列进行排序,以便从最东部的县城到最西部的县城(从纬度和长度相同)的顺序排列。我的想法是,如果用户输入他们想要向西,程序将采用起点的纬度坐标,确定阵列中应该定位的位置,然后程序选择数字中最接近的坐标到开始坐标的权利。然后程序应该获取确定的坐标并引用主坐标图,找到匹配的完整坐标集,然后将起点设置为新坐标。我使用float64s作为坐标数据类型。

所以要把它分解:数据文件的坐标为{1,1.1} {2,1.3} {3,2.4} {4,5.4} {5,6.6};起点是(1,2),用户想要往西走。所以纬度数组保持{1.2,1.3,2.4,5.4,6.6}并且程序需要从开始取2,确定它属于1.3和2.4之间,确定2.4是最接近起始坐标点。然后它采用2.4并将其与数据文件坐标进行比较以匹配{3,2.4}。起点现在是{3,2.4}。然后程序从用户选择方向开始。

我为小说道歉,但我想确保尽可能清楚(如泥,我知道LOL)。如何对排序和比较进行编码?如果有更简单的方法来完成这项任务,我会非常感激任何帮助。请记住,我只与Go合作了大约一个半月。请温和复杂的代码。大声笑谢谢!

1 个答案:

答案 0 :(得分:1)

从设计的角度来看,考虑创建一个类型,该类型封装了每个县城的信息(例如,具有城市/城镇名称,纬度和经度的结构),因为它们在逻辑上是相关的。

下面的代码示例显示了如何使用sort.Slice(...)按纬度或经度对这些对象进行排序,从而更容易找到哪一个在指定方向上最接近。

希望它有所帮助!

package main

import "sort"

type CountySeat struct {
  Name     string
  Lat, Lng float64
}

func main() {
  // Pretend we've read these from the data file.
  countySeats := []CountySeat{
    CountySeat{"Alpha", 3.0, 1.0},
    CountySeat{"Bravo", 2.0, 2.0},
    CountySeat{"Charlie", 1.0, 3.0},
  }

  // Sorting by latitude makes it easy to find N/S proximity.
  sort.Slice(countySeats, func(i, j int) bool {
    return countySeats[i].Lat < countySeats[j].Lat;
  })
  // Now countySeats are ordered by increasing latitude...

  // Sorting by longitude makes it easy to find E/W proximity.
  sort.Slice(countySeats, func(i, j int) bool {
    return countySeats[i].Lng < countySeats[j].Lng;
  })
  // Now countySeats are ordered by increasing longitude...

}