gpt4 book ai didi

golang 不能在 sort.Sort 的参数中使用类型作为类型 sort.Interface

转载 作者:IT王子 更新时间:2023-10-29 01:57:35 28 4
gpt4 key购买 nike

好的,所以我是 Go 的新手,我正在努力让自己熟悉按函数排序。我可能误解了什么,所以如果我错了请纠正我。

我正在尝试创建一个包含字段 keyvalueNodes 数组。我想创建一个自定义排序函数,通过键对节点数组进行排序。这是我到目前为止的工作:

package main

import (
"sort"
"fmt"
)

type Node struct {
key, value int
}

type ByKey []Node

func (s ByKey) Len() int {
return len(s)
}

func (s ByKey) Swap(i, j Node) {
temp := Node{key: i.key, value : i.value}
i.key, i.value = j.key, j.value
j.key, j.value = temp.key, temp.value
}

func (s ByKey) Less(i, j Node) bool {
return i.key < j.key
}


func main(){

nodes := []Node{
{ key : 1, value : 100 },
{ key : 2, value : 200 },
{ key : 3, value : 50 },
}

sort.Sort(ByKey(nodes))
fmt.Println(nodes)
}

但我在调用 Sort 的行中不断收到此错误:

cannot use ByKey(nodes) (type ByKey) as type sort.Interface in argument to sort.Sort:
ByKey does not implement sort.Interface (wrong type for Less method)
have Less(Node, Node) bool
want Less(int, int) bool

我不确定这个错误试图传达什么。任何帮助,将不胜感激。时间差

最佳答案

这些函数采用集合索引,而不是集合中的元素。然后,您可以使用这些索引对 ByKey 数组进行索引 - 请参阅此 interface 的引用资料在排序包中。

那么你需要重写你的函数来接受 int。通常你唯一需要改变的是 less 函数,在你的情况下它会使用 key 而不是仅仅说 s[i] < s[j] 你会说 s[i].key < s[j] 。 key 。这是一个可运行的示例:play.golang.org

type ByKey []Node

func (s ByKey) Len() int { return len(s) }
func (s ByKey) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s ByKey) Less(i, j int) bool { return s[i].key < s[j].key }

func main() {

nodes := []Node{
{key: 2, value: 200},
{key: 1, value: 100},
{key: 3, value: 50},
}

sort.Sort(ByKey(nodes))
fmt.Println(nodes)
}

但是,在您的情况下,因为您只想对 slice 进行排序,使用 sort.Slice 可能更方便忘记接口(interface)和单独的 slice 类型。您可以在一行代码中进行排序。

nodes := []Node{
{key: 2, value: 200},
{key: 1, value: 100},
{key: 3, value: 50},
}

sort.Slice(nodes, func(i, j int) bool { return nodes[i].key < nodes[j].key })

关于golang 不能在 sort.Sort 的参数中使用类型作为类型 sort.Interface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46705005/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com