/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.filter.function; /** * Classifies into ranges of minimum and maximum values. *

* The buckets are defined such that:
* min <= x < max *

*

* So if you provide the following min/max values:
* min = {3, 6, 9}
* max = {4, 10, 30}
*

*

* The classify function will classify items based on:
* 3 <= x < 4
* 6 <= x < 10
* 9 <= x <= 30
* * @author Cory Horner, Refractions Research * * * @source $URL$ */ public final class RangedClassifier extends Classifier { Comparable min[]; Comparable max[]; public RangedClassifier(Comparable min[], Comparable max[]) { this.min = min; this.max = max; //initialize titles this.titles = new String[min.length]; for (int i = 0; i < titles.length; i++) { titles[i] = truncateZeros(min[i].toString()) + ".." + truncateZeros(max[i].toString()); } } private String truncateZeros(String str) { if (str.indexOf(".") > -1) { while(str.endsWith("0")) { str = str.substring(0, str.length() - 1); } if (str.endsWith(".")) { str = str.substring(0, str.length() - 1); } } return str; } public int getSize() { return Math.min(min.length, max.length); } public Object getMin(int slot) { return min[slot]; } public Object getMax(int slot) { return max[slot]; } public int classify(Object value) { return classify((Comparable) value); } private int classify(Comparable val) { Comparable value = val; if (val instanceof Integer) { //convert to double as java is stupid value = new Double(((Integer) val).intValue()); } //check each slot and see if: min <= value < max int last = min.length - 1; for (int i = 0; i <= last; i++) { Comparable localMin = (Comparable) this.min[i]; Comparable localMax = (Comparable) this.max[i]; if (localMin.compareTo(value) < 1 && localMax.compareTo(value) > 0) { return i; } } if (max[last].compareTo(value) == 0) { //if value = max, put it in the last slot return last; } return -1; } }