001 /* ===========================================================
002 * JFreeChart : a free chart library for the Java(tm) platform
003 * ===========================================================
004 *
005 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
006 *
007 * Project Info: http://www.jfree.org/jfreechart/index.html
008 *
009 * This library is free software; you can redistribute it and/or modify it
010 * under the terms of the GNU Lesser General Public License as published by
011 * the Free Software Foundation; either version 2.1 of the License, or
012 * (at your option) any later version.
013 *
014 * This library is distributed in the hope that it will be useful, but
015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
017 * License for more details.
018 *
019 * You should have received a copy of the GNU Lesser General Public
020 * License along with this library; if not, write to the Free Software
021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
022 * USA.
023 *
024 * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
025 * in the United States and other countries.]
026 *
027 * -----------------------
028 * SimpleHistogramBin.java
029 * -----------------------
030 * (C) Copyright 2005 by Object Refinery Limited and Contributors.
031 *
032 * Original Author: David Gilbert (for Object Refinery Limited);
033 * Contributor(s): -;
034 *
035 * $Id: SimpleHistogramBin.java,v 1.4.2.1 2005/10/25 21:34:46 mungady Exp $
036 *
037 * Changes
038 * -------
039 * 10-Jan-2005 : Version 1 (DG);
040 *
041 */
042
043 package org.jfree.data.statistics;
044
045 import java.io.Serializable;
046
047 import org.jfree.util.PublicCloneable;
048
049 /**
050 * A bin for the {@link SimpleHistogramDataset}.
051 */
052 public class SimpleHistogramBin implements Comparable,
053 Cloneable, PublicCloneable,
054 Serializable {
055
056 /** For serialization. */
057 private static final long serialVersionUID = 3480862537505941742L;
058
059 /** The lower bound for the bin. */
060 private double lowerBound;
061
062 /** The upper bound for the bin. */
063 private double upperBound;
064
065 /**
066 * A flag that controls whether the lower bound is included in the bin
067 * range.
068 */
069 private boolean includeLowerBound;
070
071 /**
072 * A flag that controls whether the upper bound is included in the bin
073 * range.
074 */
075 private boolean includeUpperBound;
076
077 /** The item count. */
078 private int itemCount;
079
080 /**
081 * Creates a new bin.
082 *
083 * @param lowerBound the lower bound (inclusive).
084 * @param upperBound the upper bound (inclusive);
085 */
086 public SimpleHistogramBin(double lowerBound, double upperBound) {
087 this(lowerBound, upperBound, true, true);
088 }
089
090 /**
091 * Creates a new bin.
092 *
093 * @param lowerBound the lower bound.
094 * @param upperBound the upper bound.
095 * @param includeLowerBound include the lower bound?
096 * @param includeUpperBound include the upper bound?
097 */
098 public SimpleHistogramBin(double lowerBound, double upperBound,
099 boolean includeLowerBound,
100 boolean includeUpperBound) {
101 if (lowerBound >= upperBound) {
102 throw new IllegalArgumentException("Invalid bounds");
103 }
104 this.lowerBound = lowerBound;
105 this.upperBound = upperBound;
106 this.includeLowerBound = includeLowerBound;
107 this.includeUpperBound = includeUpperBound;
108 this.itemCount = 0;
109 }
110
111 /**
112 * Returns the lower bound.
113 *
114 * @return The lower bound.
115 */
116 public double getLowerBound() {
117 return this.lowerBound;
118 }
119
120 /**
121 * Return the upper bound.
122 *
123 * @return The upper bound.
124 */
125 public double getUpperBound() {
126 return this.upperBound;
127 }
128
129 /**
130 * Returns the item count.
131 *
132 * @return The item count.
133 */
134 public int getItemCount() {
135 return this.itemCount;
136 }
137
138 /**
139 * Sets the item count.
140 *
141 * @param count the item count.
142 */
143 public void setItemCount(int count) {
144 this.itemCount = count;
145 }
146
147 /**
148 * Returns <code>true</code> if the specified value belongs in the bin,
149 * and <code>false</code> otherwise.
150 *
151 * @param value the value.
152 *
153 * @return A boolean.
154 */
155 public boolean accepts(double value) {
156 if (Double.isNaN(value)) {
157 return false;
158 }
159 if (value < this.lowerBound) {
160 return false;
161 }
162 if (value > this.upperBound) {
163 return false;
164 }
165 if (value == this.lowerBound) {
166 return this.includeLowerBound;
167 }
168 if (value == this.upperBound) {
169 return this.includeUpperBound;
170 }
171 return true;
172 }
173
174 /**
175 * Returns <code>true</code> if this bin overlaps with the specified bin,
176 * and <code>false</code> otherwise.
177 *
178 * @param bin the other bin (<code>null</code> not permitted).
179 *
180 * @return A boolean.
181 */
182 public boolean overlapsWith(SimpleHistogramBin bin) {
183 if (this.upperBound < bin.lowerBound) {
184 return false;
185 }
186 if (this.lowerBound > bin.upperBound) {
187 return false;
188 }
189 if (this.upperBound == bin.lowerBound) {
190 return this.includeUpperBound && bin.includeLowerBound;
191 }
192 if (this.lowerBound == bin.upperBound) {
193 return this.includeLowerBound && bin.includeUpperBound;
194 }
195 return true;
196 }
197
198 /**
199 * Compares the bin to an arbitrary object and returns the relative
200 * ordering.
201 *
202 * @param obj the object.
203 *
204 * @return An integer indicating the relative ordering of the this bin and
205 * the given object.
206 */
207 public int compareTo(Object obj) {
208 if (!(obj instanceof SimpleHistogramBin)) {
209 return 0;
210 }
211 SimpleHistogramBin bin = (SimpleHistogramBin) obj;
212 if (this.lowerBound < bin.lowerBound) {
213 return -1;
214 }
215 if (this.lowerBound > bin.lowerBound) {
216 return 1;
217 }
218 // lower bounds are the same
219 if (this.upperBound < bin.upperBound) {
220 return -1;
221 }
222 if (this.upperBound > bin.upperBound) {
223 return 1;
224 }
225 return 0;
226 }
227
228 /**
229 * Tests this bin for equality with an arbitrary object.
230 *
231 * @param obj the object (<code>null</code> permitted).
232 *
233 * @return A boolean.
234 */
235 public boolean equals(Object obj) {
236 if (!(obj instanceof SimpleHistogramBin)) {
237 return false;
238 }
239 SimpleHistogramBin that = (SimpleHistogramBin) obj;
240 if (this.lowerBound != that.lowerBound) {
241 return false;
242 }
243 if (this.upperBound != that.upperBound) {
244 return false;
245 }
246 if (this.includeLowerBound != that.includeLowerBound) {
247 return false;
248 }
249 if (this.includeUpperBound != that.includeUpperBound) {
250 return false;
251 }
252 if (this.itemCount != that.itemCount) {
253 return false;
254 }
255 return true;
256 }
257
258 /**
259 * Returns a clone of the bin.
260 *
261 * @return A clone.
262 *
263 * @throws CloneNotSupportedException not thrown by this class.
264 */
265 public Object clone() throws CloneNotSupportedException {
266 return super.clone();
267 }
268
269 }