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 }