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

时间:2017-10-12 08:35:49

标签: go

好的,所以我是Go的新手,我正在努力让自己熟悉按功能排序。我可能误解了一些东西,所以如果我错了,请纠正我。

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

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

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

1 个答案:

答案 0 :(得分:3)

这些函数采用集合索引,而不是集合中的元素。然后使用这些索引索引到ByKey数组 - 请参阅排序包中此interface的引用。

那么你需要重写你的函数以获取int。通常需要更改的唯一一个是功能较少的功能,在您的情况下,它将使用密钥而不是仅仅说s [i]&lt; s [j]你是说s [i] .key&lt; 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)
}

但是,在您的情况下,因为您只想对切片进行排序,使用sort.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 })