对结构 Golang 的二维数组进行排序
Sort 2D array of structs 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 }
但结果似乎仍然以随机顺序返回。
我正在考虑可能对切片中的每个项目进行哈希处理,但认为可能有更简单的选择
map
上的迭代顺序,因为它是一个散列 table 是相当不确定的(它不是,真的——将具有相同键的项目以相同的确切顺序插入到 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
}
我想为结构的 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 }
但结果似乎仍然以随机顺序返回。
我正在考虑可能对切片中的每个项目进行哈希处理,但认为可能有更简单的选择
map
上的迭代顺序,因为它是一个散列 table 是相当不确定的(它不是,真的——将具有相同键的项目以相同的确切顺序插入到 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
}