Skip to content

Commit 2e414c4

Browse files
committed
update
1 parent f4bfef5 commit 2e414c4

File tree

3 files changed

+85
-73
lines changed

3 files changed

+85
-73
lines changed

README.md

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,8 @@
1-
能够让任何类型参与比较,而不是仅仅只是comparable
1+
# Comparator
22

3-
Go语言内置的比较支持:
43

54

65

7-
| Type | Comparable | Ordered | Description |
8-
| --------- | ---------- | ------- | ------------------------------------------------------------ |
9-
| Boolean ||| |
10-
| Integer ||| |
11-
| Float ||| |
12-
| Complex ||| 分别比较实数和虚数,同时相等则两个复数相等。 如果需要比较大小,需要开发者分别比较实数和虚数。 |
13-
| String ||| 基于字节逐个比较。 |
14-
| Pointer ||| 如果两个指针指向同一个对象或者都为 nil,则两者相等。 |
15-
| Channel ||| 类似 Pointer,两个 Channel 变量只有都为 nil,或者指向同一个 Channel 的时候才相等。 |
16-
| Interface ||| 两个 interface 的 Type 和 Value 值同时相等时,两者才相等。 |
17-
| Struct | ⚠️ || 仅当 Struct 内所有成员都是 Comparable,这个 Struct 才是 Comparable 的。 如果两个 struct 类型相同,且所有非空成员变量都相等,则两者相等。 |
18-
| Array | ⚠️ || 仅当成员为 Comparable,Array 才是 Comparable 的。 如果两个 Array 中的每一个元素一一相等时,则两个 Array 相等。 |
19-
| Map ||| |
20-
| Slice ||| |
21-
| Func ||| |
22-
23-
24-
25-
对原生的功能做扩展,提供更强大的比较支持:
26-
27-
- 大小
28-
- 相等
29-
306

317

328

comparable.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ import "reflect"
66
type Comparable[T any] interface {
77

88
// CompareTo 用来做比较的方法
9-
CompareTo(target *T) int
9+
CompareTo(target T) int
1010
}
1111

1212
// IsComparable 判断是否是可比较类型
13-
func IsComparable[T any](v *T) bool {
13+
func IsComparable[T any](v T) bool {
1414
reflectValue := reflect.ValueOf(v)
1515
if !reflectValue.CanInterface() {
1616
return false
@@ -20,7 +20,7 @@ func IsComparable[T any](v *T) bool {
2020
}
2121

2222
// CastToComparable 把给定的值转为Comparable接口类型,如果无法转换则会返回error
23-
func CastToComparable[T any](value *T) (Comparable[T], error) {
23+
func CastToComparable[T any](value T) (Comparable[T], error) {
2424
reflectValue := reflect.ValueOf(value)
2525
if !reflectValue.CanInterface() {
2626
return nil, ErrCastFailed

comparator.go

Lines changed: 81 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@ package compare_anything
33
import (
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 为支持排序的类型生成比较器
1717
func 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 将比较结果按原点取反以达到逆序的效果
3268
func 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

Comments
 (0)