Source for org.jfree.chart.renderer.OutlierListCollection

   1: /* ===========================================================
   2:  * JFreeChart : a free chart library for the Java(tm) platform
   3:  * ===========================================================
   4:  *
   5:  * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors.
   6:  *
   7:  * Project Info:  http://www.jfree.org/jfreechart/index.html
   8:  *
   9:  * This library is free software; you can redistribute it and/or modify it 
  10:  * under the terms of the GNU Lesser General Public License as published by 
  11:  * the Free Software Foundation; either version 2.1 of the License, or 
  12:  * (at your option) any later version.
  13:  *
  14:  * This library is distributed in the hope that it will be useful, but 
  15:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
  16:  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
  17:  * License for more details.
  18:  *
  19:  * You should have received a copy of the GNU Lesser General Public
  20:  * License along with this library; if not, write to the Free Software
  21:  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
  22:  * USA.  
  23:  *
  24:  * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
  25:  * in the United States and other countries.]
  26:  *
  27:  * --------------------------
  28:  * OutlierListCollection.java
  29:  * --------------------------
  30:  * (C) Copyright 2003, 2004, 2007, by David Browning and Contributors.
  31:  *
  32:  * Original Author:  David Browning (for Australian Institute of Marine 
  33:  *                   Science);
  34:  * Contributor(s):   -;
  35:  *
  36:  * Changes
  37:  * -------
  38:  * 05-Aug-2003 : Version 1, contributed by David Browning (DG);
  39:  * 01-Sep-2003 : Made storage internal rather than extending ArrayList (DG);
  40:  * ------------- JFREECHART 1.0.x ---------------------------------------------
  41:  * 02-Feb-2007 : Removed author tags from all over JFreeChart sources (DG);
  42:  *
  43:  */
  44: 
  45: package org.jfree.chart.renderer;
  46: 
  47: import java.util.ArrayList;
  48: import java.util.Iterator;
  49: import java.util.List;
  50: 
  51: /**
  52:  * A collection of outlier lists for a box and whisker plot. Each collection is
  53:  * associated with a single box and whisker entity.
  54:  *
  55:  * Outliers are grouped in lists for each entity. Lists contain
  56:  * one or more outliers, determined by whether overlaps have
  57:  * occurred. Overlapping outliers are grouped in the same list.
  58:  *
  59:  * @see org.jfree.chart.renderer.OutlierList
  60:  */
  61: public class OutlierListCollection {
  62: 
  63:     /** Storage for the outlier lists. */
  64:     private List outlierLists;
  65:     
  66:     /** 
  67:      * Unbelievably, outliers which are more than 2 * interquartile range are
  68:      * called far outs...  See Tukey EDA  (a classic one of a kind...)
  69:      */
  70:     private boolean highFarOut = false;
  71: 
  72:     /**
  73:      * A flag that indicates whether or not the collection contains low far 
  74:      * out values.
  75:      */
  76:     private boolean lowFarOut = false;
  77:     
  78:     /**
  79:      * Creates a new empty collection.
  80:      */
  81:     public OutlierListCollection() {
  82:         this.outlierLists = new ArrayList();
  83:     }
  84:     
  85:     /**
  86:      * A flag to indicate the presence of one or more far out values at the 
  87:      * top end of the range.
  88:      *
  89:      * @return A <code>boolean</code>.
  90:      */
  91:     public boolean isHighFarOut() {
  92:         return this.highFarOut;
  93:     }
  94: 
  95:     /**
  96:      * Sets the flag that indicates the presence of one or more far out values 
  97:      * at the top end of the range.
  98:      *
  99:      * @param farOut  the flag.
 100:      */
 101:     public void setHighFarOut(boolean farOut) {
 102:         this.highFarOut = farOut;
 103:     }
 104: 
 105:     /**
 106:      * A flag to indicate the presence of one or more far out values at the 
 107:      * bottom end of the range.
 108:      *
 109:      * @return A <code>boolean</code>.
 110:      */
 111:     public boolean isLowFarOut() {
 112:         return this.lowFarOut;
 113:     }
 114: 
 115:     /**
 116:      * Sets the flag that indicates the presence of one or more far out values 
 117:      * at the bottom end of the range.
 118:      *
 119:      * @param farOut  the flag.
 120:      */
 121:     public void setLowFarOut(boolean farOut) {
 122:         this.lowFarOut = farOut;
 123:     }
 124:     /**
 125:      * Appends the specified element as a new <code>OutlierList</code> to the
 126:      * end of this list if it does not overlap an outlier in an existing list.
 127:      *
 128:      * If it does overlap, it is appended to the outlier list which it overlaps
 129:      * and that list is updated.
 130:      *
 131:      * @param outlier  element to be appended to this list.
 132:      * 
 133:      * @return <tt>true</tt> (as per the general contract of Collection.add).
 134:      */
 135:     public boolean add(Outlier outlier) {
 136: 
 137:         if (this.outlierLists.isEmpty()) {
 138:             return this.outlierLists.add(new OutlierList(outlier));
 139:         } 
 140:         else {
 141:             boolean updated = false;
 142:             for (Iterator iterator = this.outlierLists.iterator(); 
 143:                  iterator.hasNext();) {
 144:                 OutlierList list = (OutlierList) iterator.next();
 145:                 if (list.isOverlapped(outlier)) {
 146:                     updated = updateOutlierList(list, outlier);
 147:                 }
 148:             }
 149:             if (!updated) {
 150:                 //System.err.print(" creating new outlier list ");
 151:                 updated = this.outlierLists.add(new OutlierList(outlier));
 152:             }
 153:             return updated;
 154:         }
 155: 
 156:     }
 157: 
 158:     /**
 159:      * Returns an iterator for the outlier lists.
 160:      * 
 161:      * @return An iterator.
 162:      */
 163:     public Iterator iterator() {
 164:         return this.outlierLists.iterator();    
 165:     }
 166:     
 167:     
 168:     /** 
 169:      * Updates the outlier list by adding the outlier to the end of the list and
 170:      * setting the averaged outlier to the average x and y coordinnate values 
 171:      * of the outliers in the list.
 172:      *
 173:      * @param list  the outlier list to be updated.
 174:      * @param outlier  the outlier to be added
 175:      *
 176:      * @return <tt>true</tt> (as per the general contract of Collection.add).
 177:      */
 178:     private boolean updateOutlierList(OutlierList list, Outlier outlier) {
 179:         boolean result = false;
 180:         result = list.add(outlier);
 181:         list.updateAveragedOutlier();
 182:         list.setMultiple(true);
 183:         return result;
 184:     }
 185: 
 186: }