01: /*
02: *
03: * Copyright (c) 2003 Adrian Price. All rights reserved.
04: */
05:
06: package org.obe.engine.util;
07:
08: /**
09: * Implements comparisons between objects.
10: *
11: * @author Adrian Price.
12: */
13: public final class Comparators {
14: /**
15: * Checks whether two objects are equal.
16: *
17: * @param o1
18: * @param o2
19: * @return <code>true</code> if o1 and o2 are both null or are equal.
20: */
21: public static boolean equals(Object o1, Object o2) {
22: return o1 == o2 || o1 != null && o2 != null && o1.equals(o2);
23: }
24:
25: /**
26: * Compares two objects, accounting for null values. Nulls are treated as
27: * the lexically smallest values, which results in their being sorted to the
28: * start of the list.
29: *
30: * @param o1 First object to compare.
31: * @param o2 Second object to compare.
32: * @return 0 if the objects are equal or both <code>null</code>, otherwise
33: * the result of executing <code>((Comparable)o1).compareTo(o2)</code>.
34: * @throws ClassCastException if <code>o1</code> does not implement
35: * <code>java.lang.Comparable</code>, or if the two objects are of mutually
36: * incompatible (non-comparable) classes.
37: */
38: public static int compare(Object o1, Object o2) {
39: return o1 == o2 ? 0
40: : o1 != null && o2 != null ? ((Comparable) o1)
41: .compareTo(o2) : o1 == null ? Integer.MIN_VALUE
42: : Integer.MAX_VALUE;
43: }
44:
45: /**
46: * Determines whether one set of values is an ordered subset of another.
47: *
48: * @param subset Values required for a match.
49: * @param superset Possible values to match against.
50: * @param identical <code>true</code> to match exactly in number and value.
51: * <code>false</code> to match within a particular scope. For example,
52: * subset <code>{x,y}</code> would match supersets
53: * <code>{x,y}, {x,y,z1} ... {x,y,zN} </code> etc.
54: * @return <code>true</code> if <code>subset</code> is an ordered subset of
55: * <code>superset</code> (or <code>identical</code> is <code>true</code> and
56: * the two sets are identical).
57: */
58: public static boolean match(Object[] subset, Object[] super set,
59: boolean identical) {
60:
61: if (subset != null) {
62: if (super set == null || subset.length > super set.length
63: || identical && subset.length < super set.length) {
64:
65: return false;
66: }
67:
68: for (int i = 0, n = subset.length; i < n; i++) {
69: Object key1 = subset[i];
70: Object key2 = super set[i];
71: if (!equals(key1, key2))
72: return false;
73: }
74: return true;
75: } else {
76: return !identical || super set == null;
77: }
78: }
79:
80: // Prevent instantiation.
81: private Comparators() {
82: }
83: }
|