@@ -3,19 +3,19 @@ package compare_anything
33import (
44 "github.com/golang-infrastructure/go-gtypes"
55 "math"
6- "reflect"
76 "strings"
87)
98
109// ------------------------------------------------ ---------------------------------------------------------------------
1110
1211// Comparator 比较器的接口定义,一个类型要想参与比较必须先实现比较器
13- type Comparator [T any ] func (a T , b T ) int
12+ type Comparator [T any ] func (a , b T ) int
1413
1514// ------------------------------------------------ ---------------------------------------------------------------------
1615
16+ // OrderedComparator 为支持排序的类型生成比较器
1717func OrderedComparator [T gtypes.Ordered ]() Comparator [T ] {
18- return func (a T , b T ) int {
18+ return func (a , b T ) int {
1919 if a == b {
2020 return 0
2121 } else if a < b {
@@ -26,11 +26,47 @@ func OrderedComparator[T gtypes.Ordered]() Comparator[T] {
2626 }
2727}
2828
29+ // ReverseOrderedComparator 对可比较类型逆序比较的比较器,会把较大的放在前面
30+ func ReverseOrderedComparator [T gtypes.Ordered ]() Comparator [T ] {
31+ return ReverseComparator [T ](OrderedComparator [T ]())
32+ }
33+
34+ // ------------------------------------------------ ---------------------------------------------------------------------
35+
36+ // OrderedPointerComparator 为支持排序的类型生成比较器
37+ func OrderedPointerComparator [T * gtypes.Ordered ]() Comparator [T ] {
38+ return func (a , b T ) int {
39+ // 1. 先比较指针
40+ if a == nil && b != nil {
41+ return - 1
42+ } else if a != nil && b == nil {
43+ return 1
44+ } else if a == nil && b == nil {
45+ return 0
46+ }
47+ // 2. 再比较实际的值
48+ aValue := * a
49+ bValue := * b
50+ if aValue == bValue {
51+ return 0
52+ } else if aValue < bValue {
53+ return - 1
54+ } else {
55+ return + 1
56+ }
57+ }
58+ }
59+
60+ // ReverseOrderedPointerComparator 对可比较类型逆序比较的比较器,会把较大的放在前面
61+ func ReverseOrderedPointerComparator [T * gtypes.Ordered ]() Comparator [T ] {
62+ return ReverseComparator [T ](OrderedPointerComparator [T ]())
63+ }
64+
2965// ------------------------------------------------ ---------------------------------------------------------------------
3066
3167// ReverseComparator 将比较结果按原点取反以达到逆序的效果
3268func ReverseComparator [T any ](comparator Comparator [T ]) Comparator [T ] {
33- return func (a T , b T ) int {
69+ return func (a , b T ) int {
3470 return comparator (a , b ) * - 1
3571 }
3672}
@@ -129,49 +165,49 @@ func BoolComparator() Comparator[bool] {
129165
130166// ------------------------------------------------ ---------------------------------------------------------------------
131167
132- func ArrayComparator [ T any ]() Comparator [[] T ] {
133- return func ( a [] T , b [] T ) int {
134- for index := 0 ; ; index ++ {
135- if index >= len ( a ) {
136-
137- }
138- }
139- // 对应位置先没元素的认为更小
140-
141- // 如果都有元素的话,则看元素的值
142-
143- }
144- }
168+ //// OrderedArrayComparator 承载可比较元素的数组或切片使用的比较器
169+ // func OrderedArrayComparator[T gtypes.Ordered]() Comparator[[]T] {
170+ // return func(a, b []T) int {
171+ // for index := 0; ; index++ {
172+ // // 对应位置先没元素的认为更小
173+ //
174+ // // 如果都有元素的话,则看元素的值
175+ // if index >= len(a) {
176+ //
177+ // }
178+ // }
179+ // }
180+ // }
145181
146182// ------------------------------------------------ ---------------------------------------------------------------------
147183
148- func SliceComparator [T any ]() Comparator [T ] {
149- return func (a T , b T ) int {
150-
151- // a和b都是切片,通过反射来获取它们的值
152- reflectA := reflect .ValueOf (a )
153- reflectB := reflect .ValueOf (b )
154- if ! reflectA .IsValid () && reflectB .IsValid () {
155- return 0
156- } else if ! reflectA .IsValid () {
157- return - 1
158- } else if ! reflectB .IsValid () {
159- return 1
160- }
161-
162- // 两个切片都是可用的,那就开始挨个比较吧
163- //for index := 0; ; index++ {
164- // valueA := reflectA.Index(index)
165- // kind, err := GenComparatorFromKind(valueA.Kind())
166- //
167- //}
168-
169- // 对应位置先没元素的认为更小
170-
171- // 如果都有元素的话,则看元素的值,为元素生成比较器来比较
172-
173- return 0
174- }
175- }
184+ // func SliceComparator[T any]() Comparator[T] {
185+ // return func(a T, b T) int {
186+ //
187+ // // a和b都是切片,通过反射来获取它们的值
188+ // reflectA := reflect.ValueOf(a)
189+ // reflectB := reflect.ValueOf(b)
190+ // if !reflectA.IsValid() && reflectB.IsValid() {
191+ // return 0
192+ // } else if !reflectA.IsValid() {
193+ // return -1
194+ // } else if !reflectB.IsValid() {
195+ // return 1
196+ // }
197+ //
198+ // // 两个切片都是可用的,那就开始挨个比较吧
199+ // //for index := 0; ; index++ {
200+ // // valueA := reflectA.Index(index)
201+ // // kind, err := GenComparatorFromKind(valueA.Kind())
202+ // //
203+ // //}
204+ //
205+ // // 对应位置先没元素的认为更小
206+ //
207+ // // 如果都有元素的话,则看元素的值,为元素生成比较器来比较
208+ //
209+ // return 0
210+ // }
211+ // }
176212
177213// ------------------------------------------------ ---------------------------------------------------------------------
0 commit comments