From f8b785c4cbda8c81f286aa78469ebf326d6f1f1d Mon Sep 17 00:00:00 2001 From: dudaodong Date: Fri, 2 Dec 2022 15:47:16 +0800 Subject: [PATCH] doc: add doc for Sort and SortBy --- docs/slice.md | 93 ++++++++++++++++++++++++++++++++++++++++++++- docs/slice_zh-CN.md | 92 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 181 insertions(+), 4 deletions(-) diff --git a/docs/slice.md b/docs/slice.md index 17a37b0..b566e26 100644 --- a/docs/slice.md +++ b/docs/slice.md @@ -59,7 +59,9 @@ import ( - [ReplaceAll](#ReplaceAll) - [Repeat](#Repeat) - [Shuffle](#Shuffle) -- [SortByField](#SortByField) +- [Sort](#Sort) +- [SortBy](#SortBy) +- [SortByFieldDeprecated](#SortByField) - [Some](#Some) - [StringSlice](#StringSlice) - [SymmetricDifference](#SymmetricDifference) @@ -1099,7 +1101,94 @@ func main() { } ``` -### SortByField +### Sort + +

Sorts a slice of any ordered type(number or string), use quick sort algrithm. Default sort order is ascending (asc), if want descending order, set param `sortOrder` to `desc`. Ordered type: number(all ints uints floats) or string. +

+ +Signature: + +```go +func Sort[T lancetconstraints.Ordered](slice []T, sortOrder ...string) +``` + +Example: + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/slice" +) + +func main() { + numbers := []int{1, 4, 3, 2, 5} + + slice.Sort(numbers) + fmt.Println(numbers) //{1,2,3,4,5} + + slice.Sort(numbers, "desc") + fmt.Println(numbers) //{5,4,3,2,1} + + strings := []string{"a", "d", "c", "b", "e"} + + slice.Sort(strings) + fmt.Println(strings) //{"a", "b", "c", "d", "e"} + + slice.Sort(strings, "desc") + fmt.Println(strings) //{"e", "d", "c", "b", "a"} +} +``` + + +### SortBy + +

Sorts the slice in ascending order as determined by the less function. This sort is not guaranteed to be stable.

+ +Signature: + +```go +func SortBy[T any](slice []T, less func(a, b T) bool) +``` + +Example: + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/slice" +) + +func main() { + numbers := []int{1, 4, 3, 2, 5} + + slice.SortBy(numbers, func(a, b int) bool { + return a < b + }) + fmt.Println(numbers) //{1, 2, 3, 4, 5} + + type User struct { + Name string + Age uint + } + + users := []User{ + {Name: "a", Age: 21}, + {Name: "b", Age: 15}, + {Name: "c", Age: 100}} + + slice.SortBy(users, func(a, b User) bool { + return a.Age < b.Age + }) + + fmt.Printf("sort users by age: %v", users) + + // output + // [{b 15} {a 21} {c 100}] +} +``` + + +### SortByField (Deprecated: use Sort and SortBy for replacement)

Sort struct slice by field. Slice element should be struct, field type should be int, uint, string, or bool. Default sort type is ascending (asc), if descending order, set sortType to desc

diff --git a/docs/slice_zh-CN.md b/docs/slice_zh-CN.md index 14a25c6..7836c42 100644 --- a/docs/slice_zh-CN.md +++ b/docs/slice_zh-CN.md @@ -61,7 +61,9 @@ import ( - [ReplaceAll](#ReplaceAll) - [Repeat](#Repeat) - [Shuffle](#Shuffle) -- [SortByField](#SortByField) +- [Sort](#Sort) +- [SortBy](#SortBy) +- [SortByFieldDeprecated](#SortByField) - [Some](#Some) - [StringSlice](#StringSlice) - [SymmetricDifference](#SymmetricDifference) @@ -1099,7 +1101,93 @@ func main() { } ``` -### SortByField +### Sort + +

对任何有序类型(数字或字符串)的切片进行排序,使用快速排序算法。 默认排序顺序为升序 (asc),如果需要降序,请将参数 `sortOrder` 设置为 `desc`。 Ordered类型:数字(所有整数浮点数)或字符串。

+ +函数签名: + +```go +func Sort[T lancetconstraints.Ordered](slice []T, sortOrder ...string) +``` + +例子: + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/slice" +) + +func main() { + numbers := []int{1, 4, 3, 2, 5} + + slice.Sort(numbers) + fmt.Println(numbers) //{1,2,3,4,5} + + slice.Sort(numbers, "desc") + fmt.Println(numbers) //{5,4,3,2,1} + + strings := []string{"a", "d", "c", "b", "e"} + + slice.Sort(strings) + fmt.Println(strings) //{"a", "b", "c", "d", "e"} + + slice.Sort(strings, "desc") + fmt.Println(strings) //{"e", "d", "c", "b", "a"} +} +``` + + +### SortBy + +

按照less函数确定的升序规则对切片进行排序。排序不保证稳定性

+ +函数签名: + +```go +func SortBy[T any](slice []T, less func(a, b T) bool) +``` + +例子: + +```go +import ( + "fmt" + "github.com/duke-git/lancet/v2/slice" +) + +func main() { + numbers := []int{1, 4, 3, 2, 5} + + slice.SortBy(numbers, func(a, b int) bool { + return a < b + }) + fmt.Println(numbers) //{1, 2, 3, 4, 5} + + type User struct { + Name string + Age uint + } + + users := []User{ + {Name: "a", Age: 21}, + {Name: "b", Age: 15}, + {Name: "c", Age: 100}} + + slice.SortBy(users, func(a, b User) bool { + return a.Age < b.Age + }) + + fmt.Printf("sort users by age: %v", users) + + // output + // [{b 15} {a 21} {c 100}] +} +``` + + +### SortByField (已弃用: 请使用 Sort或SortBy 代替该方法)

按字段对结构切片进行排序。slice元素应为struct,字段类型应为int、uint、string或bool。 默认排序类型是升序(asc),如果是降序,设置 sortType 为 desc