import java.lang.Comparable ; /** * Utility class to compare two objects in the sense * of the java.lang.Comparable interface * */ public class RJavaComparator { /** * compares a and b in the sense of the java.lang.Comparable if possible * *
instances of the Number interface are treated specially, in order to * allow comparing Numbers of different classes, for example it is allowed * to compare a Double with an Integer. if the Numbers have the same class, * they are compared normally, otherwise they are first converted to Doubles * and then compared
* * @param a an object * @param b another object * * @return the result ofa.compareTo(b) if this makes sense
* @throws NotComparableException if the two objects are not comparable
*/
public static int compare( Object a, Object b ) throws NotComparableException{
int res ;
if( a.equals( b ) ) return 0 ;
// treat Number s separately
if( a instanceof Number && b instanceof Number && !( a.getClass() == b.getClass() ) ){
Double _a = Double.valueOf( ((Number)a).doubleValue() );
Double _b = Double.valueOf( ((Number)b).doubleValue() );
return _a.compareTo( _b );
}
if( ! ( a instanceof Comparable ) ) throw new NotComparableException( a );
if( ! ( b instanceof Comparable ) ) throw new NotComparableException( b );
try{
res = ( (Comparable)a ).compareTo( b ) ;
} catch( ClassCastException e){
try{
res = - ((Comparable)b).compareTo( a ) ;
} catch( ClassCastException f){
throw new NotComparableException( a, b );
}
}
return res ;
}
}