JavaScript Algorithms and Data Structures 源码分析(1) -- 工具类 Comparator

Comparator 类是一个用于比较两个值的工具类.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
export default class Comparator {
/**
* 类的构造函数, 接受一个可选的compareFunction参数, 用于自定义比较函数.
* 如果没有传入compareFunction, 则会使用默认的比较函数.
*/
constructor(compareFunction) {
this.compare = compareFunction || Comparator.defaultCompareFunction;
}

/**
* 默认的比较函数, 假设a和b是字符串或数字.
* 如果a 等于 b, 则返回0
* 如果a 小于 b, 则返回-1
* 如果a 大于 b, 则返回1
*/
static defaultCompareFunction(a, b) {
if (a === b) {
return 0;
}

return a < b ? -1 : 1;
}

/**
* 检查两个变量是否相等.
* 内部调用this.compare(a, b), 如果返回值为0, 表示相等, 返回true; 否则返回false.
*/
equal(a, b) {
return this.compare(a, b) === 0;
}

/**
* 检查变量a是否小于b.
* 内部调用this.compare(a, b), 如果返回值是-1, 表示a小于b, 返回true; 否则返回false
*/
lessThan(a, b) {
return this.compare(a, b) < 0;
}

/**
* 检查变量a是否大于b
* 内部调用this.compare(a, b), 如果返回值为1, 表示a大于b, 返回true; 否则返回false
*/
greaterThan(a, b) {
return this.compare(a, b) > 0;
}

/**
* 检查变量a是否小于等于b.
*/
lessThanOrEqual(a, b) {
return this.lessThan(a, b) || this.equal(a, b);
}

/**
* 检查变量a是否大于等于b
*/
greaterThanOrEqual(a, b) {
return this.greaterThan(a, b) || this.equal(a, b);
}

/**
* 反转比较顺序. 将当前的比较函数this.compare替换为compareOriginal(b, a), 实现反转比较的效果.
*/
reverse() {
const compareOriginal = this.compare;
this.compare = (a, b) => compareOriginal(b, a);
}
}

Comparator类种, compareFunction是一个可选参数, 可以传入自定义的比较函数. 如果没有传入比较函数, 则会使用默认的比较函数. compareFunction应该是一个函数, 接受两个参数ab, 返回一个数字, 表示它们的比较结果.

这个类的目的是为了提供一种方便的方式来进行比较操作, 以及在需要时动态地改变比较顺序.