为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
倚天杖 2022-12-13 16:02:36
我想为结构的 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 }但结果似乎仍然以随机顺序返回。我正在考虑可能对切片中的每个项目进行哈希处理,但认为可能有一个更简单的选择
查看完整描述

1 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

a 上的迭代顺序map,因为它是一个哈希表,所以它是相当不确定的(实际上,它不是 - 将具有相同键的项目以完全相同的顺序插入到 2 个映射中,每个映射的迭代顺序将是相同的)。

假设您的地图是一个map[string]Hit,为了以确定的顺序对其进行迭代,我将枚举地图中的键集,对其进行排序,然后使用该排序集来枚举地图。

是这样的

package main


import (

  "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

}


查看完整回答
反对 回复 2022-12-13
  • 1 回答
  • 0 关注
  • 225 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号