KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > prefuse > util > collections > CompositeComparator


1 package prefuse.util.collections;
2
3 import java.util.Comparator JavaDoc;
4
5 /**
6  * Comparator that makes comparison using an ordered list of
7  * individual comparators;
8  *
9  * @author <a HREF="http://jheer.org">jeffrey heer</a>
10  */

11 public class CompositeComparator implements Comparator JavaDoc {
12
13     private static final int INCREMENT = 2;
14     private Comparator JavaDoc[] m_cmp;
15     private int m_rev = 1;
16     private int m_size = 0;
17
18     /**
19      * Creates an empty CompositeComparator with the given capacity.
20      * @param size the starting capacity of this comparator
21      */

22     public CompositeComparator(int size) {
23         this(size, false);
24     }
25     
26     /**
27      * Creates an empty CompositeComparator with the given capacity.
28      * @param size the starting capacity of this comparator
29      * @param reverse when true, reverses the sort order of the included
30      * comparators, when false, objects are sorted as usual
31      */

32     public CompositeComparator(int size, boolean reverse) {
33         m_cmp = new Comparator JavaDoc[size];
34         m_rev = reverse ? -1 : 1;
35     }
36     
37     /**
38      * Creates a new CompositeComparator.
39      * @param cmp the constituent comparators of this composite
40      */

41     public CompositeComparator(Comparator JavaDoc[] cmp) {
42         this(cmp, false);
43     }
44     
45     /**
46      * Creates a new CompositeComparator.
47      * @param cmp the constituent comparators of this composite
48      * @param reverse when true, reverses the sort order of the included
49      * comparators, when false, objects are sorted as usual
50      */

51     public CompositeComparator(Comparator JavaDoc[] cmp, boolean reverse) {
52         this(cmp.length, reverse);
53         System.arraycopy(cmp, 0, m_cmp, 0, cmp.length);
54         m_size = cmp.length;
55     }
56     
57     /**
58      * Adds an additional comparator to this composite.
59      * @param c the Comparator to add
60      */

61     public void add(Comparator JavaDoc c) {
62         if ( c == null ) return;
63         if ( m_cmp.length == m_size ) {
64             Comparator JavaDoc[] cmp = new Comparator JavaDoc[m_size+INCREMENT];
65             System.arraycopy(m_cmp, 0, cmp, 0, m_size);
66             m_cmp = cmp;
67         }
68         m_cmp[m_size++] = c;
69     }
70     
71     /**
72      * Removes a comparator from this composite.
73      * @param c the Comparator to remove
74      * @return true if the comparator was successfully removed,
75      * false otherwise
76      */

77     public boolean remove(Comparator JavaDoc c) {
78         for ( int i=0; i<m_size; ++i ) {
79             if ( m_cmp[i].equals(c) ) {
80                 System.arraycopy(m_cmp, i+1, m_cmp, i, m_size-i);
81                 --m_size;
82                 return true;
83             }
84         }
85         return false;
86     }
87     
88     // ------------------------------------------------------------------------
89

90     /**
91      * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
92      */

93     public int compare(Object JavaDoc o1, Object JavaDoc o2) {
94         for ( int i=0; i<m_cmp.length; ++i ) {
95             int c = m_cmp[i].compare(o1, o2);
96             if ( c != 0 ) {
97                 return m_rev*c;
98             }
99         }
100         return 0;
101     }
102
103 } // end of class CompositeComparator
104
Popular Tags