对结构 Golang 的二维数组进行排序

我想为结构的 2D 切片创建一致的顺序,我正在从地图创建 2D 切片,因此顺序总是不同的。


我的结构看起来像


// Hit contains the data for a hit.

type Hit struct {

    Key  string  `json:"key"`

    Data []Field `json:"data"`

}


// Hits stores a list of hits.

type Hits [][]Hit

我想为我的类型内容提供一致的顺序Hits。


我努力了:



func (c Hits) Len() int { return len(c) }



func (c Hits) Swap(i, j int) { c[i], c[j] = c[j], c[i] }



func (c Hits) Less(i, j int) bool { return strings.Compare(c[i][0].Key, c[j][0].Key) == -1 }

但结果似乎仍然以随机顺序返回。


我正在考虑可能对切片中的每个项目进行哈希处理,但认为可能有一个更简单的选择


倚天杖
浏览 226回答 1
1回答

繁星淼淼

a 上的迭代顺序map,因为它是一个哈希表,所以它是相当不确定的(实际上,它不是 - 将具有相同键的项目以完全相同的顺序插入到 2 个映射中,每个映射的迭代顺序将是相同的)。假设您的地图是一个map[string]Hit,为了以确定的顺序对其进行迭代,我将枚举地图中的键集,对其进行排序,然后使用该排序集来枚举地图。是这样的:package mainimport (  "fmt"  "sort")type Hit struct {  Key  string  `json:"key"`  Data []Field `json:"data"`}type Field struct {  Value string `json:"value"`}func main() {  var mapOfHits = getSomeHits()  var sortedHits = sortHits(mapOfHits)    for _, h := range sortedHits {    fmt.Println(h.Key)  }}func getSomeHits() map[string]Hit {  return make(map[string]Hit, 0)}func sortHits(m map[string]Hit) []Hit {  keys := make([]string, 0, len(m))  sorted := make([]Hit, 0, len(m))    for k := range m {    keys = append(keys, k)  }  sort.Strings(keys)  for _, k := range keys {    sorted = append(sorted, m[k])  }  return sorted}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go