diff --git a/src/java/org/apache/commons/collections/comparators/ComparableComparator.java b/src/java/org/apache/commons/collections/comparators/ComparableComparator.java new file mode 100644 index 000000000..67322e52a --- /dev/null +++ b/src/java/org/apache/commons/collections/comparators/ComparableComparator.java @@ -0,0 +1,125 @@ +package org.apache.commons.collections.comparators; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache Commons" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache Turbine", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import java.util.Comparator; +import java.lang.Comparable; + +/** + * A Comparator that compares Comparable objects. + * Throws ClassCastExceptions if the objects are not + * Comparable, or if they are null. + * Throws ClassCastException if the compareTo of both + * objects do not provide an inverse result of each other + * as per the Comparable javadoc. + * + * @author bayard@generationjava.com + * @version $Id: ComparableComparator.java,v 1.1 2002/02/26 22:42:31 morgand Exp $ + */ +public class ComparableComparator implements Comparator { + + public ComparableComparator() { + } + + public int compare(Object o1, Object o2) { + if( (o1 == null) || (o2 == null) ) { + throw new ClassCastException( + "There were nulls in the arguments for this method: "+ + "compare("+o1 + ", " + o2 + ")" + ); + } + + if(o1 instanceof Comparable) { + if(o2 instanceof Comparable) { + int result1 = ((Comparable)o1).compareTo(o2); + int result2 = ((Comparable)o2).compareTo(o1); + + // enforce comparable contract + if(result1 == 0 && result2 == 0) { + return 0; + } else + if(result1 < 0 && result2 > 0) { + return result1; + } else + if(result1 > 0 && result2 < 0) { + return result1; + } else { + // results inconsistent + throw new ClassCastException("o1 not comparable to o2"); + } + } else { + // o2 wasn't comparable + throw new ClassCastException( + "The first argument of this method was not a Comparable: " + + o2.getClass().getName() + ); + } + } else + if(o2 instanceof Comparable) { + // o1 wasn't comparable + throw new ClassCastException( + "The second argument of this method was not a Comparable: " + + o1.getClass().getName() + ); + } else { + // neither were comparable + throw new ClassCastException( + "Both arguments of this method were not Comparables: " + + o1.getClass().getName() + " and " + o2.getClass().getName() + ); + } + } + +} diff --git a/src/java/org/apache/commons/collections/comparators/NumericStringComparator.java b/src/java/org/apache/commons/collections/comparators/NumericStringComparator.java new file mode 100644 index 000000000..965711f07 --- /dev/null +++ b/src/java/org/apache/commons/collections/comparators/NumericStringComparator.java @@ -0,0 +1,224 @@ +package org.apache.commons.collections.comparators; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache Commons" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache Turbine", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import java.util.Comparator; + +/** + * A Comparator which deals with alphabet characters 'naturally', but + * deals with numerics numerically. Leading 0's are ignored numerically, + * but do come into play if the number is equal. Thus aaa119yyyy comes before + * aaa0119xxxx regardless of x or y. + * + * The comparison should be very performant as it only ever deals with + * issues at a character level and never tries to consider the + * numerics as numbers. + * + * @author bayard@generationjava.com + * @version $Id: NumericStringComparator.java,v 1.1 2002/02/26 22:42:31 morgand Exp $ + */ +public class NumericStringComparator implements Comparator { + + public NumericStringComparator() { + } + + public int compare(Object o1, Object o2) { + if(o1 == null) { + return 1; + } else + if(o2 == null) { + return -1; + } + + String s1 = o1.toString(); + String s2 = o2.toString(); + + // find the first digit. + int idx1 = getFirstDigitIndex(s1); + int idx2 = getFirstDigitIndex(s2); + + if( ( idx1 == -1 ) || + ( idx2 == -1 ) || + ( !s1.substring(0,idx1).equals(s2.substring(0,idx2)) ) + ) + { + return s1.compareTo(s2); + } + + // find the last digit + int edx1 = getLastDigitIndex(s1, idx1); + int edx2 = getLastDigitIndex(s2, idx2); + + String sub1 = null; + String sub2 = null; + + if(edx1 == -1) { + sub1 = s1.substring(idx1); + } else { + sub1 = s1.substring(idx1, edx1); + } + + if(edx2 == -1) { + sub2 = s2.substring(idx2); + } else { + sub2 = s2.substring(idx2, edx2); + } + + // deal with zeros at start of each number + int zero1 = countZeroes(sub1); + int zero2 = countZeroes(sub2); + + sub1 = sub1.substring(zero1); + sub2 = sub2.substring(zero2); + + // if equal, then recurse with the rest of the string + // need to deal with zeroes so that 00119 appears after 119 + if(sub1.equals(sub2)) { + int ret = 0; + if(zero1 > zero2) { + ret = 1; + } else + if(zero1 < zero2) { + ret = -1; + } + if(edx1 != -1) { + int comp = compare(s1.substring(edx1), s2.substring(edx2)); + if(comp != 0) { + ret = comp; + } + } + return ret; + } else { + // if a numerical string is smaller in length than another + // then it must be less. + if(sub1.length() != sub2.length()) { + return ( sub1.length() < sub2.length() ) ? -1 : 1; + } + } + + + // now we get to do the string based numerical thing :) + // going to assume that the individual character for the + // number has the right order. ie) '9' > '0' + // possibly bad in i18n. + char[] chr1 = sub1.toCharArray(); + char[] chr2 = sub2.toCharArray(); + + int sz = chr1.length; + for(int i=0; i. + */ + +import java.util.Comparator; + +/** + * Sorts java package names. + * Packages are grouped into java, javax, and other. + * Inside each one they are alphabetical. + * + * @author bayard@generationjava.com + * @version $Id: PackageNameComparator.java,v 1.1 2002/02/26 22:42:31 morgand Exp $ + */ +public class PackageNameComparator implements Comparator { + + static private int JAVA = 1; + static private int JAVAX = 2; + static private int OTHER = 3; + + public int compare(Object obj1, Object obj2) { + if( (obj1 instanceof String) && (obj2 instanceof String) ) { + String str1 = (String)obj1; + String str2 = (String)obj2; + int type1 = getType(str1); + int type2 = getType(str2); + + if(type1 == JAVA) { + if(type2 == JAVA) { + str1 = str1.substring(4); + str2 = str2.substring(4); + } else { + return -1; + } + } else + if(type2 == JAVA) { + return 1; + } else + if(type1 == JAVAX) { + if(type2 == JAVAX) { + str1 = str1.substring(5); + str2 = str2.substring(5); + } else { + return -1; + } + } else + if(type2 == JAVAX) { + return 1; + } + + return str1.compareTo(str2); + } else { + return 0; + } + } + + private static int getType(String str) { + if(str.startsWith("java")) { + if(str.charAt(4) == '.') { + return JAVA; + } else + if( (str.charAt(4) == 'x') && (str.charAt(5) == '.') ) { + return JAVAX; + } + } + return OTHER; + } + +} diff --git a/src/java/org/apache/commons/collections/comparators/ReverseComparator.java b/src/java/org/apache/commons/collections/comparators/ReverseComparator.java new file mode 100644 index 000000000..e416c0335 --- /dev/null +++ b/src/java/org/apache/commons/collections/comparators/ReverseComparator.java @@ -0,0 +1,91 @@ +package org.apache.commons.collections.comparators; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache Commons" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache Turbine", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import java.util.Comparator; + +/** + * Reverses the order of another comparator. + * + * @author bayard@generationjava.com + * @version $Id: ReverseComparator.java,v 1.1 2002/02/26 22:42:31 morgand Exp $ + */ +public class ReverseComparator implements Comparator { + + private Comparator comparator; + + /** + * Creates a reverse comparator that will invert any list. + */ + public ReverseComparator() { + } + + /** + * Creates a reverse comparator that inverts the comparison + * of the passed in comparator. + */ + public ReverseComparator(Comparator comparator) { + this.comparator = comparator; + } + + public int compare(Object o1, Object o2) { + if(comparator == null) { + return -1; + } else { + return -1*comparator.compare(o1,o2); + } + } + +} diff --git a/src/java/org/apache/commons/collections/comparators/UrlComparator.java b/src/java/org/apache/commons/collections/comparators/UrlComparator.java new file mode 100644 index 000000000..dc546792b --- /dev/null +++ b/src/java/org/apache/commons/collections/comparators/UrlComparator.java @@ -0,0 +1,108 @@ +package org.apache.commons.collections.comparators; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache Commons" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache Turbine", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import java.util.Comparator; +import java.net.URL; + +/** + * Compares URLs. Initially ignores protocol, so + * ftp://sun.com and * http://sun.com will compare + * near each other. Also pays attention to ports last, so + * http://www:8080/index.html and http://www/index.html + * will sort near each other. + * + * @author bayard@generationjava.com + * @version $Id: UrlComparator.java,v 1.1 2002/02/26 22:42:31 morgand Exp $ + */ +public class UrlComparator implements Comparator { + + public UrlComparator() { + } + + public int compare(Object o1, Object o2) { + if( (o1 instanceof URL) && (o2 instanceof URL)) { + URL u1 = (URL)o1; + URL u2 = (URL)o2; + int ret = 0; + + ret = u1.getHost().compareTo(u2.getHost()); + if(ret != 0) { + return ret; + } + + ret = u1.getPath().compareTo(u2.getPath()); + if(ret != 0) { + return ret; + } + + ret = u1.getProtocol().compareTo(u2.getProtocol()); + if(ret != 0) { + return ret; + } + + if(u1.getPort() < u2.getPort()) { + return -1; + } else + if(u1.getPort() < u2.getPort()) { + return 1; + } + + } + + return 0; + } + +}