From 2276b288b80ca834379716a87b2a6a2a9b7e9a3a Mon Sep 17 00:00:00 2001 From: Henri Yandell Date: Mon, 8 Aug 2011 05:11:16 +0000 Subject: [PATCH] Copying from Collections to Lang git-svn-id: https://svn.apache.org/repos/asf/commons/proper/lang/trunk@1154830 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/lang3/compare/NullComparator.java | 182 ++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 src/main/java/org/apache/commons/lang3/compare/NullComparator.java diff --git a/src/main/java/org/apache/commons/lang3/compare/NullComparator.java b/src/main/java/org/apache/commons/lang3/compare/NullComparator.java new file mode 100644 index 000000000..4b6a394ea --- /dev/null +++ b/src/main/java/org/apache/commons/lang3/compare/NullComparator.java @@ -0,0 +1,182 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.collections.comparators; + +import java.io.Serializable; +import java.util.Comparator; + +import org.apache.commons.collections.ComparatorUtils; + +/** + * A Comparator that will compare nulls to be either lower or higher than + * other objects. + * + * @since Commons Collections 2.0 + * @version $Revision$ $Date$ + * + * @author Michael A. Smith + */ +public class NullComparator implements Comparator, Serializable { + + /** Serialization version. */ + private static final long serialVersionUID = -5820772575483504339L; + + /** + * The comparator to use when comparing two non-null objects. + **/ + private final Comparator nonNullComparator; + + /** + * Specifies whether a null are compared as higher than + * non-null objects. + **/ + private final boolean nullsAreHigh; + + //----------------------------------------------------------------------- + /** + * Construct an instance that sorts null higher than any + * non-null object it is compared with. When comparing two + * non-null objects, the {@link ComparableComparator} is + * used. + **/ + @SuppressWarnings("unchecked") + public NullComparator() { + this(ComparatorUtils.NATURAL_COMPARATOR, true); + } + + /** + * Construct an instance that sorts null higher than any + * non-null object it is compared with. When comparing two + * non-null objects, the specified {@link Comparator} is + * used. + * + * @param nonNullComparator the comparator to use when comparing two + * non-null objects. This argument cannot be + * null + * + * @exception NullPointerException if nonNullComparator is + * null + **/ + public NullComparator(Comparator nonNullComparator) { + this(nonNullComparator, true); + } + + /** + * Construct an instance that sorts null higher or lower than + * any non-null object it is compared with. When comparing + * two non-null objects, the {@link ComparableComparator} is + * used. + * + * @param nullsAreHigh a true value indicates that + * null should be compared as higher than a + * non-null object. A false value indicates + * that null should be compared as lower than a + * non-null object. + **/ + @SuppressWarnings("unchecked") + public NullComparator(boolean nullsAreHigh) { + this(ComparatorUtils.NATURAL_COMPARATOR, nullsAreHigh); + } + + /** + * Construct an instance that sorts null higher or lower than + * any non-null object it is compared with. When comparing + * two non-null objects, the specified {@link Comparator} is + * used. + * + * @param nonNullComparator the comparator to use when comparing two + * non-null objects. This argument cannot be + * null + * + * @param nullsAreHigh a true value indicates that + * null should be compared as higher than a + * non-null object. A false value indicates + * that null should be compared as lower than a + * non-null object. + * + * @exception NullPointerException if nonNullComparator is + * null + **/ + public NullComparator(Comparator nonNullComparator, boolean nullsAreHigh) { + this.nonNullComparator = nonNullComparator; + this.nullsAreHigh = nullsAreHigh; + + if (nonNullComparator == null) { + throw new NullPointerException("null nonNullComparator"); + } + } + + //----------------------------------------------------------------------- + /** + * Perform a comparison between two objects. If both objects are + * null, a 0 value is returned. If one object + * is null and the other is not, the result is determined on + * whether the Comparator was constructed to have nulls as higher or lower + * than other objects. If neither object is null, an + * underlying comparator specified in the constructor (or the default) is + * used to compare the non-null objects. + * + * @param o1 the first object to compare + * @param o2 the object to compare it to. + * @return -1 if o1 is "lower" than (less than, + * before, etc.) o2; 1 if o1 is + * "higher" than (greater than, after, etc.) o2; or + * 0 if o1 and o2 are equal. + **/ + public int compare(E o1, E o2) { + if(o1 == o2) { return 0; } + if(o1 == null) { return (this.nullsAreHigh ? 1 : -1); } + if(o2 == null) { return (this.nullsAreHigh ? -1 : 1); } + return this.nonNullComparator.compare(o1, o2); + } + + //----------------------------------------------------------------------- + /** + * Implement a hash code for this comparator that is consistent with + * {@link #equals(Object)}. + * + * @return a hash code for this comparator. + **/ + @Override + public int hashCode() { + return (nullsAreHigh ? -1 : 1) * nonNullComparator.hashCode(); + } + + /** + * Determines whether the specified object represents a comparator that is + * equal to this comparator. + * + * @param obj the object to compare this comparator with. + * + * @return true if the specified object is a NullComparator + * with equivalent null comparison behavior + * (i.e. null high or low) and with equivalent underlying + * non-null object comparators. + **/ + @Override + public boolean equals(Object obj) { + if(obj == null) { return false; } + if(obj == this) { return true; } + if(!obj.getClass().equals(this.getClass())) { return false; } + + NullComparator other = (NullComparator) obj; + + return ((this.nullsAreHigh == other.nullsAreHigh) && + (this.nonNullComparator.equals(other.nonNullComparator))); + } + +}