Golang 如何对Search类型的切片进行排序
在许多应用程序中,对字符串值的切片进行排序是常见的任务,Go提供了一个内置的sort包,其中包括对任意类型的切片(包括字符串值的切片)进行排序的函数。 在本文中,我们将讨论如何在Golang中对实现了Search接口的字符串值切片进行排序。
在Go中使用sort.Search函数执行排序切片上的二分查找,该函数接受三个参数:切片的长度,将切片中的元素与给定值进行比较的函数以及要搜索的值。该函数返回值的索引是找到的值或应插入以保持切片排序顺序的位置。
要对在Golang中实现了Search接口的字符串值切片进行排序,我们可以使用sort.Search函数以及sort.Interface接口的自定义实现。
例子
以下是如何实现的示例 –
package main
import (
"fmt"
"sort"
)
type Person struct {
Name string
Age int
}
type People []Person
func (p People) Len() int {
return len(p)
}
func (p People) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}
func (p People) Less(i, j int) bool {
return p[i].Age < p[j].Age
}
func (p People) Search(name string) int {
return sort.Search(len(p), func(i int) bool {
return p[i].Name >= name
})
}
func main() {
people := People{
{"Alice", 25},
{"Bob", 20},
{"Charlie", 30},
{"David", 35},
}
fmt.Println("Original slice:", people)
sort.Sort(people)
fmt.Println("Sorted slice:", people)
fmt.Println("Index of Alice:", people.Search("Alice"))
fmt.Println("Index of Bob:", people.Search("Bob"))
fmt.Println("Index of Charlie:", people.Search("Charlie"))
fmt.Println("Index of David:", people.Search("David"))
}
输出结果
Original slice: [{Alice 25} {Bob 20} {Charlie 30} {David 35}]
Sorted slice: [{Bob 20} {Alice 25} {Charlie 30} {David 35}]
Index of Alice: 0
Index of Bob: 2
Index of Charlie: 2
Index of David: 3
在上面的示例中,我们定义了自定义类型People,该类型表示Person值的切片。 然后,我们通过定义Len(),Swap()和Less()方法来实现此类型的sort.Interface接口。此外,我们实现了Search()方法,该方法使用sort.Search函数按名称查找人的索引。
最后,我们使用此自定义类型创建Person值切片,然后使用sort.Sort()函数按年龄升序对切片进行排序。然后,我们使用Search()方法找到已排序切片中每个人的索引。
结论
使用sort.Search函数以及sort.Interface接口的自定义实现可以对在Golang中实现了Search接口的字符串值切片进行排序。了解如何对字符串值切片进行排序对于编写高效和有效的Go代码是必不可少的。