import java.util.TreeMap;
/**
* Static methods for doing useful math
*
* @author : $Author: brian $
* @version : $Revision: 1.1 $
*
*
* The Monterey Bay Aquarium Research Institute (MBARI) provides this
* documentation and code "as is", with no warranty, express or
* implied, of its quality or consistency. It is provided without support and
* without obligation on the part of MBARI to assist in its use, correction,
* modification, or enhancement. This information should not be published or
* distributed to third parties without specific written permission from
* MBARI.
*
* Copyright 2002 MBARI.
* MBARI Proprietary Information. All rights reserved.
*
*/
public class Util{
/**
* Returns an array of indices indicating the order the data should be sorted
* in. Duplicate values are discarded with the first one being kept. This method
* is useful when a number of data arrays have to be sorted based on the values in
* some coordinate array, such as time.
*
* To convert a array of values to a sorted monooic array try:
* double[] x; // some 1-D array of data
* int[] i = MathUtilities.uniqueSort(x);
* double[] xSorted = MathUtilities.orderVector(x, i);
*
* @param x An array of data that is to be sorted.
* @return order An array of indexes such that y = Array.sort(x) and
* y = x(order) are the same.
*/
public static final synchronized int[] uniqueSort(double[] x) {
TreeMap tm = new TreeMap();
for (int i = 0; i < x.length; i++) {
Double key = new Double(x[i]);
boolean exists = tm.containsKey(key);
if (exists) {
// Do nothing. Ignore duplicate keys
}
else {
tm.put(key, new Integer(i));
}
}
Object[] values = tm.values().toArray();
int[] order = new int[values.length];
for (int i = 0; i < values.length; i++) {
Integer tmp = (Integer) values[i];
order[i] = tmp.intValue();
}
return order;
}
}