I find it very satisfying that sorting methods in the JDK can detect if your comparer is not obeying the contract.
There are a lot of errors that cause the contract to be violated according to [2].
Here are the rules in short as described in [3]:
- sign(compare(x,y)) == -sign(compare(y,x))
- (compare(x, y)>0) && (compare(y, z)>0)) implies compare(x, z)>0 (transitivity)
- compare(x, y)==0 implies that sgn(compare(x, z))==sgn(compare(y, z))
References
- [1] GitHub - Flyway - Issue 1249
- https://github.com/flyway/flyway/issues/1249
- [2] StackOverflow - “Comparison method violates its general contract!”
- http://stackoverflow.com/questions/8327514/comparison-method-violates-its-general-contract
- [3] Oracle Javadoc - Interface Comparator>T>
- https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html
No comments:
Post a Comment