Golang:将结构体切片中唯一值为 true 的结构体排序至首位
Golang:将结构体切片中唯一值为 true 的结构体排序至首位
本文介绍了在 Golang 中如何对包含 bool 类型的结构体切片进行排序,将唯一值为 true 的结构体放在首位,并详细解释了自定义排序函数的实现逻辑。
假设我们有一个包含 myStruct 结构体的切片,每个 myStruct 包含一个 val 整数和一个 flag 布尔值。我们希望将 flag 为 true 的 myStruct 排序到切片的首位。
可以使用自定义排序函数来实现:
import "sort"
type myStruct struct {
val int
flag bool
}
func main() {
s := []myStruct{
{val: 3, flag: false},
{val: 1, flag: true},
{val: 2, flag: false},
{val: 4, flag: false},
}
sort.Slice(s, func(i, j int) bool {
if s[i].flag && !s[j].flag {
return true
} else if !s[i].flag && s[j].flag {
return false
} else {
return s[i].val < s[j].val
}
})
fmt.Println(s)
}
输出结果为:
[{1 true} {2 false} {3 false} {4 false}]
排序函数首先判断两个结构体的 flag 值,如果一个为 true 一个为 false,则将 true 的排在前面;如果两个都为 true 或都为 false,则按照 val 的大小来排序。
解释:
sort.Slice(s, func(i, j int) bool { ... }): 使用sort.Slice函数对s切片进行排序,排序规则由匿名函数定义。- 匿名函数: 该函数接收两个索引
i和j作为参数,返回一个布尔值,用于指示s[i]是否应该排在s[j]之前。 - 排序逻辑: 函数首先判断
s[i].flag和s[j].flag的值,如果s[i].flag为true且s[j].flag为false,则返回true,表示s[i]应该排在s[j]之前。反之亦然。如果两者都为true或都为false,则根据s[i].val和s[j].val的值进行比较,较小的值排在前面。
通过以上代码和解释,我们成功实现了将 flag 为 true 的 myStruct 排序到切片的首位。
原文地址: https://www.cveoy.top/t/topic/f2qF 著作权归作者所有。请勿转载和采集!