Golang:将结构体切片中唯一值为 true 的结构体排序至首位

本文介绍了在 Golang 中如何对包含 bool 类型的结构体切片进行排序,将唯一值为 true 的结构体放在首位,并详细解释了自定义排序函数的实现逻辑。

假设我们有一个包含 myStruct 结构体的切片,每个 myStruct 包含一个 val 整数和一个 flag 布尔值。我们希望将 flagtruemyStruct 排序到切片的首位。

可以使用自定义排序函数来实现:

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 切片进行排序,排序规则由匿名函数定义。
  • 匿名函数: 该函数接收两个索引 ij 作为参数,返回一个布尔值,用于指示 s[i] 是否应该排在 s[j] 之前。
  • 排序逻辑: 函数首先判断 s[i].flags[j].flag 的值,如果 s[i].flagtrues[j].flagfalse,则返回 true,表示 s[i] 应该排在 s[j] 之前。反之亦然。如果两者都为 true 或都为 false,则根据 s[i].vals[j].val 的值进行比较,较小的值排在前面。

通过以上代码和解释,我们成功实现了将 flagtruemyStruct 排序到切片的首位。

Golang:将结构体切片中唯一值为 true 的结构体排序至首位

原文地址: https://www.cveoy.top/t/topic/f2qF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录