1 cananian 1.1.2.1 // SortedMapComparator.java, created Mon Sep 17 16:57:49 2001 by cananian
 2 cananian 1.1.2.1 // Copyright (C) 2000 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 cananian 1.1.2.1 package harpoon.Util;
 5 cananian 1.1.2.1 
 6 cananian 1.1.2.1 import java.util.Comparator;
 7 cananian 1.1.2.1 import java.util.Iterator;
 8 cananian 1.1.2.1 import java.util.Map;
 9 cananian 1.1.2.1 import java.util.Set;
10 cananian 1.1.2.1 import java.util.SortedMap;
11 cananian 1.3     
12 cananian 1.3     import net.cscott.jutil.Default;
13 cananian 1.1.2.1 /**
14 cananian 1.1.2.1  * A <code>SortedMapComparator</code> compares two sorted maps
15 cananian 1.1.2.1  * entry-by-entry (treating the map as a sorted pair list).
16 cananian 1.1.2.1  * 
17 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
18 cananian 1.3      * @version $Id: SortedMapComparator.java,v 1.3 2004/02/08 01:56:15 cananian Exp $
19 cananian 1.1.2.1  */
20 cananian 1.3     public class SortedMapComparator<K,V> implements Comparator<SortedMap<K,V>> {
21 cananian 1.3         final Comparator<? super K> keyComparator;
22 cananian 1.3         final Comparator<? super V> valueComparator;
23 cananian 1.1.2.1 
24 cananian 1.1.2.1     /** Creates a <code>SortedMapComparator</code> which compares
25 cananian 1.1.2.1      *  entries in the order defined by the <code>SortedMap</code> and
26 cananian 1.1.2.1      *  compares keys before values.
27 cananian 1.1.2.1      *  All keys and values must implement <code>java.lang.Comparable</code>.
28 cananian 1.1.2.1      */
29 cananian 1.1.2.1     public SortedMapComparator() { this(null, null); }
30 cananian 1.1.2.1     /** Creates a <code>SortedMapComparator</code> which compares
31 cananian 1.1.2.1      *  entries in the order defined by the <code>SortedMap</code>
32 cananian 1.1.2.1      *  and compares keys (using <code>keyComparator</code>) before values
33 cananian 1.1.2.1      *  (using <code>valueComparator</code>).
34 cananian 1.1.2.1      *  If <code>keyComparator</code> is <code>null</code>, then all
35 cananian 1.1.2.1      *  keys must implement <code>java.lang.Comparable</code>.
36 cananian 1.1.2.1      *  If <code>valueComparator</code> is <code>null</code>, then all
37 cananian 1.1.2.1      *  values must implement <code>java.lang.Comparable</code>.
38 cananian 1.1.2.1      */
39 cananian 1.3         public SortedMapComparator(Comparator<? super K> keyComparator,
40 cananian 1.3                                    Comparator<? super V> valueComparator) {
41 cananian 1.1.2.1         this.keyComparator = (keyComparator==null) ?
42 cananian 1.3                 Default.<K>comparator() : keyComparator;
43 cananian 1.1.2.1         this.valueComparator = (valueComparator==null) ?
44 cananian 1.3                 Default.<V>comparator() : valueComparator;
45 cananian 1.1.2.1     }
46 cananian 1.1.2.1 
47 cananian 1.3         public int compare(SortedMap<K,V> sm1, SortedMap<K,V> sm2) {
48 cananian 1.1.2.1         // throws ClassCastException if objects are not the proper types.
49 cananian 1.3             Iterator<Map.Entry<K,V>> it1 = sm1.entrySet().iterator();
50 cananian 1.3             Iterator<Map.Entry<K,V>> it2 = sm2.entrySet().iterator();
51 cananian 1.1.2.1         while (it1.hasNext() && it2.hasNext()) {
52 cananian 1.3                 Map.Entry<K,V> me1 = it1.next();
53 cananian 1.3                 Map.Entry<K,V> me2 = it2.next();
54 cananian 1.1.2.1             int kcmp = keyComparator.compare(me1.getKey(), me2.getKey());
55 cananian 1.1.2.1             if (kcmp!=0) return kcmp;
56 cananian 1.1.2.1             int vcmp = valueComparator.compare(me1.getValue(), me2.getValue());
57 cananian 1.1.2.1             if (vcmp!=0) return vcmp;
58 cananian 1.1.2.1         }
59 cananian 1.1.2.1         // for maps of unequal size, the shorter is the smaller.
60 cananian 1.1.2.1         return it1.hasNext() ? 1 : it2.hasNext() ? -1 : 0;
61 cananian 1.1.2.1     }
62 cananian 1.2     }