/* * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package java.util; import java.io.Serializable; import java.util.function.Function; import java.util.function.ToIntFunction; import java.util.function.ToLongFunction; import java.util.function.ToDoubleFunction; import java.util.Comparators; /** * A comparison function, which imposes a total ordering on * some collection of objects. Comparators can be passed to a sort * method (such as {@link Collections#sort(List,Comparator) * Collections.sort} or {@link Arrays#sort(Object[],Comparator) * Arrays.sort}) to allow precise control over the sort order. * Comparators can also be used to control the order of certain data * structures (such as {@linkplain SortedSet sorted sets} or * {@linkplain SortedMap sorted maps}), or to provide an ordering for * collections of objects that don't have a {@linkplain Comparable * natural ordering}.
* * The ordering imposed by a comparator {@code c} on a set of elements * {@code S} is said to be consistent with equals if and only if * {@code c.compare(e1, e2)==0} has the same boolean value as * {@code e1.equals(e2)} for every {@code e1} and {@code e2} in * {@code S}.
* * Caution should be exercised when using a comparator capable of imposing an * ordering inconsistent with equals to order a sorted set (or sorted map). * Suppose a sorted set (or sorted map) with an explicit comparator {@code c} * is used with elements (or keys) drawn from a set {@code S}. If the * ordering imposed by {@code c} on {@code S} is inconsistent with equals, * the sorted set (or sorted map) will behave "strangely." In particular the * sorted set (or sorted map) will violate the general contract for set (or * map), which is defined in terms of {@code equals}.
* * For example, suppose one adds two elements {@code a} and {@code b} such that * {@code (a.equals(b) && c.compare(a, b) != 0)} * to an empty {@code TreeSet} with comparator {@code c}. * The second {@code add} operation will return * true (and the size of the tree set will increase) because {@code a} and * {@code b} are not equivalent from the tree set's perspective, even though * this is contrary to the specification of the * {@link Set#add Set.add} method.
* * Note: It is generally a good idea for comparators to also implement * {@code java.io.Serializable}, as they may be used as ordering methods in * serializable data structures (like {@link TreeSet}, {@link TreeMap}). In * order for the data structure to serialize successfully, the comparator (if * provided) must implement {@code Serializable}.
* * For the mathematically inclined, the relation that defines the * imposed ordering that a given comparator {@code c} imposes on a * given set of objects {@code S} is:
* {(x, y) such that c.compare(x, y) <= 0}. *The quotient for this total order is:
* {(x, y) such that c.compare(x, y) == 0}. ** * It follows immediately from the contract for {@code compare} that the * quotient is an equivalence relation on {@code S}, and that the * imposed ordering is a total order on {@code S}. When we say that * the ordering imposed by {@code c} on {@code S} is consistent with * equals, we mean that the quotient for the ordering is the equivalence * relation defined by the objects' {@link Object#equals(Object) * equals(Object)} method(s):
* {(x, y) such that x.equals(y)}.* * In other words, when the imposed ordering is consistent with * equals, the equivalence classes defined by the equivalence relation * of the {@code equals} method and the equivalence classes defined by * the quotient of the {@code compare} method are the same. *
Unlike {@code Comparable}, a comparator may optionally permit * comparison of null arguments, while maintaining the requirements for * an equivalence relation. * *
This interface is a member of the
*
* Java Collections Framework.
*
* @param
*
* The implementor must ensure that {@link Integer#signum
* signum}{@code (compare(x, y)) == -signum(compare(y, x))} for
* all {@code x} and {@code y}. (This implies that {@code
* compare(x, y)} must throw an exception if and only if {@code
* compare(y, x)} throws an exception.)
*
* The implementor must also ensure that the relation is transitive:
* {@code ((compare(x, y)>0) && (compare(y, z)>0))} implies
* {@code compare(x, z)>0}.
*
* Finally, the implementor must ensure that {@code compare(x,
* y)==0} implies that {@code signum(compare(x,
* z))==signum(compare(y, z))} for all {@code z}.
*
* @apiNote
* It is generally the case, but not strictly required that
* {@code (compare(x, y)==0) == (x.equals(y))}. Generally speaking,
* any comparator that violates this condition should clearly indicate
* this fact. The recommended language is "Note: this comparator
* imposes orderings that are inconsistent with equals."
*
* @param o1 the first object to be compared.
* @param o2 the second object to be compared.
* @return a negative integer, zero, or a positive integer as the
* first argument is less than, equal to, or greater than the
* second.
* @throws NullPointerException if an argument is null and this
* comparator does not permit null arguments
* @throws ClassCastException if the arguments' types prevent them from
* being compared by this comparator.
*/
int compare(T o1, T o2);
/**
* Indicates whether some other object is "equal to"
* this comparator. This method must obey the general contract of
* {@link Object#equals(Object)}. Additionally, this method can
* return {@code true} only if the specified object is also
* a comparator and it imposes the same ordering as this
* comparator. Thus, {@code comp1.equals(comp2)} implies that
* {@link Integer#signum signum}{@code (comp1.compare(o1,
* o2))==signum(comp2.compare(o1, o2))} for every object reference
* {@code o1} and {@code o2}.
*
* Note that it is always safe not to override
* {@code Object.equals(Object)}. However, overriding this method may,
* in some cases, improve performance by allowing programs to determine
* that two distinct comparators impose the same order.
*
* @param obj the reference object with which to compare.
* @return {@code true} only if the specified object is also
* a comparator and it imposes the same ordering as this
* comparator.
* @see Object#equals(Object)
* @see Object#hashCode()
*/
boolean equals(Object obj);
/**
* Returns a comparator that imposes the reverse ordering of this
* comparator.
*
* @return a comparator that imposes the reverse ordering of this
* comparator.
* @since 1.8
*/
default Comparator The returned comparator is serializable if the specified comparator
* is also serializable.
*
* @apiNote
* For example, to sort a collection of {@code String} based on the length
* and then case-insensitive natural ordering, the comparator can be
* composed using following code,
*
* The returned comparator is serializable and throws {@link
* NullPointerException} when comparing {@code null}.
*
* @param The returned comparator is serializable and throws {@link
* NullPointerException} when comparing {@code null}.
*
* @param The returned comparator is serializable if the specified comparator
* is serializable.
*
* @param The returned comparator is serializable if the specified comparator
* is serializable.
*
* @param The returned comparator is serializable if the specified function
* and comparator are both serializable.
*
* @apiNote
* For example, to obtain a {@code Comparator} that compares {@code
* Person} objects by their last name ignoring case differences,
*
* The returned comparator is serializable if the specified function
* is also serializable.
*
* @apiNote
* For example, to obtain a {@code Comparator} that compares {@code
* Person} objects by their last name,
*
* The returned comparator is serializable if the specified function
* is also serializable.
*
* @param The returned comparator is serializable if the specified function is
* also serializable.
*
* @param The returned comparator is serializable if the specified function
* is also serializable.
*
* @param {@code
* Comparator
*
* @param other the other comparator to be used when this comparator
* compares two objects that are equal.
* @return a lexicographic-order comparator composed of this and then the
* other comparator
* @throws NullPointerException if the argument is null.
* @since 1.8
*/
default Comparator{@code
* Comparator
*
* @param {@code
* Comparator
*
* @param