001/* =========================================================== 002 * JFreeChart : a free chart library for the Java(tm) platform 003 * =========================================================== 004 * 005 * (C) Copyright 2000-2013, 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 * [Oracle and Java are registered trademarks of Oracle and/or its affiliates. 025 * Other names may be trademarks of their respective owners.] 026 * 027 * ---------------------- 028 * BoxAndWhiskerItem.java 029 * ---------------------- 030 * (C) Copyright 2003-2008, by Object Refinery Limited and Contributors. 031 * 032 * Original Author: David Gilbert (for Object Refinery Limited); 033 * Contributor(s): -; 034 * 035 * Changes 036 * ------- 037 * 27-Aug-2003 : Version 1 (DG); 038 * 01-Mar-2004 : Added equals() method and implemented Serializable (DG); 039 * ------------- JFREECHART 1.0.x --------------------------------------------- 040 * 15-Nov-2006 : Added toString() method override (DG); 041 * 02-Oct-2007 : Added new constructor (for convenience) (DG); 042 * 043 */ 044 045package org.jfree.data.statistics; 046 047import java.io.Serializable; 048import java.util.Collections; 049import java.util.List; 050 051import org.jfree.util.ObjectUtilities; 052 053/** 054 * Represents one data item within a box-and-whisker dataset. Instances of 055 * this class are immutable. 056 */ 057public class BoxAndWhiskerItem implements Serializable { 058 059 /** For serialization. */ 060 private static final long serialVersionUID = 7329649623148167423L; 061 062 /** The mean. */ 063 private Number mean; 064 065 /** The median. */ 066 private Number median; 067 068 /** The first quarter. */ 069 private Number q1; 070 071 /** The third quarter. */ 072 private Number q3; 073 074 /** The minimum regular value. */ 075 private Number minRegularValue; 076 077 /** The maximum regular value. */ 078 private Number maxRegularValue; 079 080 /** The minimum outlier. */ 081 private Number minOutlier; 082 083 /** The maximum outlier. */ 084 private Number maxOutlier; 085 086 /** The outliers. */ 087 private List outliers; 088 089 /** 090 * Creates a new box-and-whisker item. 091 * 092 * @param mean the mean (<code>null</code> permitted). 093 * @param median the median (<code>null</code> permitted). 094 * @param q1 the first quartile (<code>null</code> permitted). 095 * @param q3 the third quartile (<code>null</code> permitted). 096 * @param minRegularValue the minimum regular value (<code>null</code> 097 * permitted). 098 * @param maxRegularValue the maximum regular value (<code>null</code> 099 * permitted). 100 * @param minOutlier the minimum outlier (<code>null</code> permitted). 101 * @param maxOutlier the maximum outlier (<code>null</code> permitted). 102 * @param outliers the outliers (<code>null</code> permitted). 103 */ 104 public BoxAndWhiskerItem(Number mean, 105 Number median, 106 Number q1, 107 Number q3, 108 Number minRegularValue, 109 Number maxRegularValue, 110 Number minOutlier, 111 Number maxOutlier, 112 List outliers) { 113 114 this.mean = mean; 115 this.median = median; 116 this.q1 = q1; 117 this.q3 = q3; 118 this.minRegularValue = minRegularValue; 119 this.maxRegularValue = maxRegularValue; 120 this.minOutlier = minOutlier; 121 this.maxOutlier = maxOutlier; 122 this.outliers = outliers; 123 124 } 125 126 /** 127 * Creates a new box-and-whisker item. 128 * 129 * @param mean the mean. 130 * @param median the median 131 * @param q1 the first quartile. 132 * @param q3 the third quartile. 133 * @param minRegularValue the minimum regular value. 134 * @param maxRegularValue the maximum regular value. 135 * @param minOutlier the minimum outlier value. 136 * @param maxOutlier the maximum outlier value. 137 * @param outliers a list of the outliers. 138 * 139 * @since 1.0.7 140 */ 141 public BoxAndWhiskerItem(double mean, double median, double q1, double q3, 142 double minRegularValue, double maxRegularValue, double minOutlier, 143 double maxOutlier, List outliers) { 144 145 // pass values to other constructor 146 this(new Double(mean), new Double(median), new Double(q1), 147 new Double(q3), new Double(minRegularValue), 148 new Double(maxRegularValue), new Double(minOutlier), 149 new Double(maxOutlier), outliers); 150 151 } 152 153 /** 154 * Returns the mean. 155 * 156 * @return The mean (possibly <code>null</code>). 157 */ 158 public Number getMean() { 159 return this.mean; 160 } 161 162 /** 163 * Returns the median. 164 * 165 * @return The median (possibly <code>null</code>). 166 */ 167 public Number getMedian() { 168 return this.median; 169 } 170 171 /** 172 * Returns the first quartile. 173 * 174 * @return The first quartile (possibly <code>null</code>). 175 */ 176 public Number getQ1() { 177 return this.q1; 178 } 179 180 /** 181 * Returns the third quartile. 182 * 183 * @return The third quartile (possibly <code>null</code>). 184 */ 185 public Number getQ3() { 186 return this.q3; 187 } 188 189 /** 190 * Returns the minimum regular value. 191 * 192 * @return The minimum regular value (possibly <code>null</code>). 193 */ 194 public Number getMinRegularValue() { 195 return this.minRegularValue; 196 } 197 198 /** 199 * Returns the maximum regular value. 200 * 201 * @return The maximum regular value (possibly <code>null</code>). 202 */ 203 public Number getMaxRegularValue() { 204 return this.maxRegularValue; 205 } 206 207 /** 208 * Returns the minimum outlier. 209 * 210 * @return The minimum outlier (possibly <code>null</code>). 211 */ 212 public Number getMinOutlier() { 213 return this.minOutlier; 214 } 215 216 /** 217 * Returns the maximum outlier. 218 * 219 * @return The maximum outlier (possibly <code>null</code>). 220 */ 221 public Number getMaxOutlier() { 222 return this.maxOutlier; 223 } 224 225 /** 226 * Returns a list of outliers. 227 * 228 * @return A list of outliers (possibly <code>null</code>). 229 */ 230 public List getOutliers() { 231 if (this.outliers == null) { 232 return null; 233 } 234 return Collections.unmodifiableList(this.outliers); 235 } 236 237 /** 238 * Returns a string representation of this instance, primarily for 239 * debugging purposes. 240 * 241 * @return A string representation of this instance. 242 */ 243 @Override 244 public String toString() { 245 return super.toString() + "[mean=" + this.mean + ",median=" 246 + this.median + ",q1=" + this.q1 + ",q3=" + this.q3 + "]"; 247 } 248 249 /** 250 * Tests this object for equality with an arbitrary object. 251 * 252 * @param obj the object to test against (<code>null</code> permitted). 253 * 254 * @return A boolean. 255 */ 256 @Override 257 public boolean equals(Object obj) { 258 259 if (obj == this) { 260 return true; 261 } 262 if (!(obj instanceof BoxAndWhiskerItem)) { 263 return false; 264 } 265 BoxAndWhiskerItem that = (BoxAndWhiskerItem) obj; 266 if (!ObjectUtilities.equal(this.mean, that.mean)) { 267 return false; 268 } 269 if (!ObjectUtilities.equal(this.median, that.median)) { 270 return false; 271 } 272 if (!ObjectUtilities.equal(this.q1, that.q1)) { 273 return false; 274 } 275 if (!ObjectUtilities.equal(this.q3, that.q3)) { 276 return false; 277 } 278 if (!ObjectUtilities.equal(this.minRegularValue, 279 that.minRegularValue)) { 280 return false; 281 } 282 if (!ObjectUtilities.equal(this.maxRegularValue, 283 that.maxRegularValue)) { 284 return false; 285 } 286 if (!ObjectUtilities.equal(this.minOutlier, that.minOutlier)) { 287 return false; 288 } 289 if (!ObjectUtilities.equal(this.maxOutlier, that.maxOutlier)) { 290 return false; 291 } 292 if (!ObjectUtilities.equal(this.outliers, that.outliers)) { 293 return false; 294 } 295 return true; 296 } 297 298}