1 | from abc import ABC, abstractmethod
|
---|
2 | from typing import TypeVar, Generic, Any
|
---|
3 |
|
---|
4 | T=TypeVar("T")
|
---|
5 |
|
---|
6 | class Comparator(Generic[T]):
|
---|
7 |
|
---|
8 | @abstractmethod
|
---|
9 | def compare(self, o1:T, o2:T)-> int:
|
---|
10 | '''
|
---|
11 | Compares its two arguments for order. Returns a negative integer,
|
---|
12 | zero, or a positive integer as the first argument is less than, equal
|
---|
13 | to, or greater than the second.<p>
|
---|
14 |
|
---|
15 | The implementor must ensure that {@code sgn(compare(x, y)) ==
|
---|
16 | -sgn(compare(y, x))} for all {@code x} and {@code y}. (This
|
---|
17 | implies that {@code compare(x, y)} must throw an exception if and only
|
---|
18 | if {@code compare(y, x)} throws an exception.)<p>
|
---|
19 |
|
---|
20 | The implementor must also ensure that the relation is transitive:
|
---|
21 | {@code ((compare(x, y)>0) && (compare(y, z)>0))} implies
|
---|
22 | {@code compare(x, z)>0}.<p>
|
---|
23 |
|
---|
24 | Finally, the implementor must ensure that {@code compare(x, y)==0}
|
---|
25 | implies that {@code sgn(compare(x, z))==sgn(compare(y, z))} for all
|
---|
26 | {@code z}.<p>
|
---|
27 |
|
---|
28 | It is generally the case, but <i>not</i> strictly required that
|
---|
29 | {@code (compare(x, y)==0) == (x.equals(y))}. Generally speaking,
|
---|
30 | any comparator that violates this condition should clearly indicate
|
---|
31 | this fact. The recommended language is "Note: this comparator
|
---|
32 | imposes orderings that are inconsistent with equals."<p>
|
---|
33 |
|
---|
34 | In the foregoing description, the notation
|
---|
35 | {@code sgn(}<i>expression</i>{@code )} designates the mathematical
|
---|
36 | <i>signum</i> function, which is defined to return one of {@code -1},
|
---|
37 | {@code 0}, or {@code 1} according to whether the value of
|
---|
38 | <i>expression</i> is negative, zero, or positive, respectively.
|
---|
39 |
|
---|
40 | @param o1 the first object to be compared.
|
---|
41 | @param o2 the second object to be compared.
|
---|
42 | @return a negative integer, zero, or a positive integer as the
|
---|
43 | first argument is less than, equal to, or greater than the
|
---|
44 | second.
|
---|
45 | @raises ValueError if an argument is null and this
|
---|
46 | comparator does not permit null arguments
|
---|
47 | @raises ClassCastException if the arguments' types prevent them from
|
---|
48 | being compared by this comparator.
|
---|
49 |
|
---|
50 | '''
|
---|
51 | pass
|
---|
52 |
|
---|
53 |
|
---|
54 | class DefaultComparator(Comparator[Any]):
|
---|
55 | def compare(self, o1:Any, o2:Any)-> int:
|
---|
56 | return -1 if o1<o2 else 1 if o1>o2 else 0
|
---|
57 |
|
---|
58 |
|
---|