2017-10-12 15 views
1

さて、私は非常に新しいです。私は自分自身を関数のソートに慣れさせようとしています。私は何か誤解しているかもしれないので、間違っていれば私を修正してください。golangは型sortとして型を使用することはできません。sort.Sortへの引数のインタフェース

フィールドkeyvalueを持つNodesの配列を作成しようとしています。彼らのキーでノードの配列をソートするカスタムソート関数を作成したいと思います。

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

Lessメソッドの署名が間違っています。 2つのintを取ることになっています。 [標準パッケージの例](https://golang.org/pkg/sort/#example_)を参照してください。 – Peter

+0

私はそれをどのように変更する必要がありますか? – MrPyCharm

+1

[標準パッケージの例](https://golang.org/pkg/sort/#example_)を参照してください。 – Peter

答えて

3

これらの関数はコレクションの要素ではなく、コレクションのインデックスを取得します。これらのインデックスを使用して、ByKey配列にインデックスを付けます。ソートパッケージのinterfaceのリファレンスを参照してください。

だからintをとるように関数を書き直す必要があります。あなたが変更する必要がある唯一のものは、関数が少ないことです。あなたの場合、s [i] < [j]と言っているのではなく、キーを使用します。 。キー。 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を使用して、インターフェイスおよび個別のスライスタイプを忘れるする方が便利かもしれません。ここでは、実行可能な例です。コードの1行でソートを実行できます。

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 }) 
関連する問題