我有一个导入的类型
type ExternalType struct {
quantity int
}
type ExternalArray []*ExternalType
我希望能够为ExternalArray实现排序接口,以便按数量对其进行排序。
但是,我不确定我该怎么做?
具体的例子如下:
答案 0 :(得分:5)
sort.Interface
定义了必须实现的三种方法:
// Len is the number of elements in the collection.
Len() int
// Less reports whether the element with
// index i should sort before the element with index j.
Less(i, j int) bool
// Swap swaps the elements with indexes i and j.
Swap(i, j int)
在这种情况下,这看起来像是:
type ExternalType struct {
quantity int
}
type ExternalArray []*ExternalType
func (ea ExternalArray) Len() int {
return len(ea)
}
func (ea ExternalArray) Less(i, j int) bool {
return ea[i].quantity < ea[j].quantity
}
func (ea ExternalArray) Swap(i, j int) {
ea[i], ea[j] = ea[j], ea[i]
}
为了进行排序,您可以使用sort.Sort
,例如:
arr := ExternalArray{
&ExternalType{quantity: 33},
&ExternalType{quantity: 44},
&ExternalType{quantity: 22},
&ExternalType{quantity: 11},
}
sort.Sort(arr)
// `arr` is now sorted :-)
Here是游乐场的一个实例。
答案 1 :(得分:3)
在当前包中定义一个类型,该类型使用与导入类型相同的元素类型对切片进行排序:
type byQuantity []*pkg.ExternalType
func (a byQuantity) Len() int { return len(a) }
func (a byQuantity) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a byQuantity) Less(i, j int) bool { return a[i].Quantity < a[j].Quantity }
Convert导入的切片类型值为上面定义的类型并排序:
a := pkg.ExternalArray{{1}, {3}, {2}}
sort.Sort(byQuantity(a))
// a is now sorted by quantity
由于原始切片和转换后的切片共享相同的支持数组,因此对转换切片进行排序也会对原始切片进行排序。