Golang 根据字符串首字符排序,要求顺序:特殊字符 > 数字 > 英文 > 中文按照拼音排序

目的:优先特殊字符,其次数字,然后英文,最后中文按照拼音排序

思路:创建一个用于中文字符排序的比较器 c := collate.New(language.Chinese, collate.Numeric)

代码示例

GitHub 完整示例代码

import (
	"sort"
	"golang.org/x/text/collate"
	"golang.org/x/text/language"
)

// 该接口定义一个获取排序字段的函数
type SortByStringAble interface {
    
    
	GetStrSortField() string
}

func SortByString[T SortByStringAble](list []T, sortType string) []T {
    
    
	// 创建一个用于中文字符排序的比较器
	c := collate.New(language.Chinese, collate.Numeric)

	// 使用 sort.SliceStable 保持稳定排序
	sort.SliceStable(list, func(i, j int) bool {
    
    
		if sortType == "desc" {
    
    
			return c.CompareString(list[i].GetStrSortField(), list[j].GetStrSortField()) > 0
		}
		return c.CompareString(list[i].GetStrSortField(), list[j].GetStrSortField()) < 0
	})

	return list
}

单元测试代码:

package service

import (
	"fmt"
	"testing"
)

type User struct {
    
    
	Name string
	No   int
}

func (u *User) GetStrSortField() string {
    
    
	return u.Name
}
func TestSortByString(t *testing.T) {
    
    
	list := []*User{
    
    }
	list = append(list, &User{
    
    Name: "a2", No: 4})
	list = append(list, &User{
    
    Name: "1", No: 2})
	list = append(list, &User{
    
    Name: "中a", No: 8})
	list = append(list, &User{
    
    Name: "啊bc", No: 7})
	list = append(list, &User{
    
    Name: "阿ab", No: 6})
	list = append(list, &User{
    
    Name: "b1", No: 5})
	list = append(list, &User{
    
    Name: "2a", No: 3})
	list = append(list, &User{
    
    Name: "~!天", No: 1})

	fmt.Printf("old list: \n")
	for i := 0; i < len(list); i++ {
    
    
		fmt.Printf("%+v \n", list[i])
	}

	list = SortByString(list, "asc")

	fmt.Printf("new list: \n")
	for i := 0; i < len(list); i++ {
    
    
		fmt.Printf("%+v \n", list[i])
	}
}

猜你喜欢

转载自blog.csdn.net/trinityleo5/article/details/137439202