package prefuse.util.collections;
import java.util.Comparator;
/**
* Comparator that makes comparison using an ordered list of
* individual comparators;
*
* @author <a href="http://jheer.org">jeffrey heer</a>
*/
public class CompositeComparator implements Comparator {
private static final int INCREMENT = 2;
private Comparator[] m_cmp;
private int m_rev = 1;
private int m_size = 0;
/**
* Creates an empty CompositeComparator with the given capacity.
* @param size the starting capacity of this comparator
*/
public CompositeComparator(int size) {
this(size, false);
}
/**
* Creates an empty CompositeComparator with the given capacity.
* @param size the starting capacity of this comparator
* @param reverse when true, reverses the sort order of the included
* comparators, when false, objects are sorted as usual
*/
public CompositeComparator(int size, boolean reverse) {
m_cmp = new Comparator[size];
m_rev = reverse ? -1 : 1;
}
/**
* Creates a new CompositeComparator.
* @param cmp the constituent comparators of this composite
*/
public CompositeComparator(Comparator[] cmp) {
this(cmp, false);
}
/**
* Creates a new CompositeComparator.
* @param cmp the constituent comparators of this composite
* @param reverse when true, reverses the sort order of the included
* comparators, when false, objects are sorted as usual
*/
public CompositeComparator(Comparator[] cmp, boolean reverse) {
this(cmp.length, reverse);
System.arraycopy(cmp, 0, m_cmp, 0, cmp.length);
m_size = cmp.length;
}
/**
* Adds an additional comparator to this composite.
* @param c the Comparator to add
*/
public void add(Comparator c) {
if ( c == null ) return;
if ( m_cmp.length == m_size ) {
Comparator[] cmp = new Comparator[m_size+INCREMENT];
System.arraycopy(m_cmp, 0, cmp, 0, m_size);
m_cmp = cmp;
}
m_cmp[m_size++] = c;
}
/**
* Removes a comparator from this composite.
* @param c the Comparator to remove
* @return true if the comparator was successfully removed,
* false otherwise
*/
public boolean remove(Comparator c) {
for ( int i=0; i<m_size; ++i ) {
if ( m_cmp[i].equals(c) ) {
System.arraycopy(m_cmp, i+1, m_cmp, i, m_size-i);
--m_size;
return true;
}
}
return false;
}
// ------------------------------------------------------------------------
/**
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
public int compare(Object o1, Object o2) {
for ( int i=0; i<m_cmp.length; ++i ) {
int c = m_cmp[i].compare(o1, o2);
if ( c != 0 ) {
return m_rev*c;
}
}
return 0;
}
} // end of class CompositeComparator