    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     * DefaultStatisticalCategoryDataset.java
    029     * --------------------------------------
    030     * (C) Copyright 2002-2005, by Pascal Collet and Contributors.
    031     *
    032     * Original Author:  Pascal Collet;
    033     * Contributor(s):   David Gilbert (for Object Refinery Limited);
    034     *
    035     * $Id: DefaultStatisticalCategoryDataset.java,v 1.8.2.1 2005/10/25 21:34:46 mungady Exp $
    036     *
    037     * Changes
    038     * -------
    039     * 21-Aug-2002 : Version 1, contributed by Pascal Collet (DG);
    040     * 07-Oct-2002 : Fixed errors reported by Checkstyle (DG);
    041     * 05-Feb-2003 : Revised implementation to use KeyedObjects2D (DG);
    042     * 28-Aug-2003 : Moved from org.jfree.data --> org.jfree.data.statistics (DG);
    043     * 06-Oct-2003 : Removed incorrect Javadoc text (DG);
    044     * 18-Nov-2004 : Updated for changes in RangeInfo interface (DG);
    045     * 11-Jan-2005 : Removed deprecated code in preparation for the 1.0.0
    046     *               release (DG);
    047     * 01-Feb-2005 : Changed minimumRangeValue and maximumRangeValue from Double
    048     *               to double (DG);
    049     * 05-Feb-2005 : Implemented equals() method (DG);
    050     *
    051     */
    052
    053    package org.jfree.data.statistics;
    054
    055    import java.util.List;
    056
    057    import org.jfree.data.KeyedObjects2D;
    058    import org.jfree.data.Range;
    059    import org.jfree.data.RangeInfo;
    060    import org.jfree.data.general.AbstractDataset;
    061
    062    /**
    063     * A convenience class that provides a default implementation of the
    064     * {@link StatisticalCategoryDataset} interface.
    065     *
    066     * @author Pascal Collet
    067     */
    068    public class DefaultStatisticalCategoryDataset extends AbstractDataset
    069        implements StatisticalCategoryDataset, RangeInfo {
    070
    071        /** Storage for the data. */
    072        private KeyedObjects2D data;
    073
    074        /** The minimum range value. */
    075        private double minimumRangeValue;
    076
    077        /** The maximum range value. */
    078        private double maximumRangeValue;
    079
    080        /** The range of values. */
    081        private Range rangeBounds;
    082
    083        /**
    084         * Creates a new dataset.
    085         */
    086        public DefaultStatisticalCategoryDataset() {
    087            this.data = new KeyedObjects2D();
    088            this.minimumRangeValue = 0.0;
    089            this.maximumRangeValue = 0.0;
    090            this.rangeBounds = new Range(0.0, 0.0);
    091        }
    092
    093        /**
    094         * Returns the mean value for an item.
    095         *
    096         * @param row  the row index (zero-based).
    097         * @param column  the column index (zero-based).
    098         *
    099         * @return The mean value.
    100         */
    101        public Number getMeanValue(int row, int column) {
    102            Number result = null;
    103            MeanAndStandardDeviation masd
    104                = (MeanAndStandardDeviation) this.data.getObject(row, column);
    105            if (masd != null) {
    106                result = masd.getMean();
    107            }
    108            return result;
    109        }
    110
    111        /**
    112         * Returns the value for an item (for this dataset, the mean value is
    113         * returned).
    114         *
    115         * @param row  the row index.
    116         * @param column  the column index.
    117         *
    118         * @return The value.
    119         */
    120        public Number getValue(int row, int column) {
    121            return getMeanValue(row, column);
    122        }
    123
    124        /**
    125         * Returns the value for an item (for this dataset, the mean value is
    126         * returned).
    127         *
    128         * @param rowKey  the row key.
    129         * @param columnKey  the columnKey.
    130         *
    131         * @return The value.
    132         */
    133        public Number getValue(Comparable rowKey, Comparable columnKey) {
    134            return getMeanValue(rowKey, columnKey);
    135        }
    136
    137        /**
    138         * Returns the mean value for an item.
    139         *
    140         * @param rowKey  the row key.
    141         * @param columnKey  the columnKey.
    142         *
    143         * @return The mean value.
    144         */
    145        public Number getMeanValue(Comparable rowKey, Comparable columnKey) {
    146            Number result = null;
    147            MeanAndStandardDeviation masd
    148                = (MeanAndStandardDeviation) this.data.getObject(rowKey, columnKey);
    149            if (masd != null) {
    150                result = masd.getMean();
    151            }
    152            return result;
    153        }
    154
    155        /**
    156         * Returns the standard deviation value for an item.
    157         *
    158         * @param row  the row index (zero-based).
    159         * @param column  the column index (zero-based).
    160         *
    161         * @return The standard deviation.
    162         */
    163        public Number getStdDevValue(int row, int column) {
    164            Number result = null;
    165            MeanAndStandardDeviation masd
    166                = (MeanAndStandardDeviation) this.data.getObject(row, column);
    167            if (masd != null) {
    168                result = masd.getStandardDeviation();
    169            }
    170            return result;
    171        }
    172
    173        /**
    174         * Returns the standard deviation value for an item.
    175         *
    176         * @param rowKey  the row key.
    177         * @param columnKey  the columnKey.
    178         *
    179         * @return The standard deviation.
    180         */
    181        public Number getStdDevValue(Comparable rowKey, Comparable columnKey) {
    182            Number result = null;
    183            MeanAndStandardDeviation masd
    184                = (MeanAndStandardDeviation) this.data.getObject(rowKey, columnKey);
    185            if (masd != null) {
    186                result = masd.getStandardDeviation();
    187            }
    188            return result;
    189        }
    190
    191        /**
    192         * Returns the column index for a given key.
    193         *
    194         * @param key  the column key.
    195         *
    196         * @return The column index.
    197         */
    198        public int getColumnIndex(Comparable key) {
    199            return this.data.getColumnIndex(key);
    200        }
    201
    202        /**
    203         * Returns a column key.
    204         *
    205         * @param column  the column index (zero-based).
    206         *
    207         * @return The column key.
    208         */
    209        public Comparable getColumnKey(int column) {
    210            return this.data.getColumnKey(column);
    211        }
    212
    213        /**
    214         * Returns the column keys.
    215         *
    216         * @return The keys.
    217         */
    218        public List getColumnKeys() {
    219            return this.data.getColumnKeys();
    220        }
    221
    222        /**
    223         * Returns the row index for a given key.
    224         *
    225         * @param key  the row key.
    226         *
    227         * @return The row index.
    228         */
    229        public int getRowIndex(Comparable key) {
    230            return this.data.getRowIndex(key);
    231        }
    232
    233        /**
    234         * Returns a row key.
    235         *
    236         * @param row  the row index (zero-based).
    237         *
    238         * @return The row key.
    239         */
    240        public Comparable getRowKey(int row) {
    241            return this.data.getRowKey(row);
    242        }
    243
    244        /**
    245         * Returns the row keys.
    246         *
    247         * @return The keys.
    248         */
    249        public List getRowKeys() {
    250            return this.data.getRowKeys();
    251        }
    252
    253        /**
    254         * Returns the number of rows in the table.
    255         *
    256         * @return The row count.
    257         */
    258        public int getRowCount() {
    259            return this.data.getRowCount();
    260        }
    261
    262        /**
    263         * Returns the number of columns in the table.
    264         *
    265         * @return The column count.
    266         */
    267        public int getColumnCount() {
    268            return this.data.getColumnCount();
    269        }
    270
    271        /**
    272         * Adds a mean and standard deviation to the table.
    273         *
    274         * @param mean  the mean.
    275         * @param standardDeviation  the standard deviation.
    276         * @param rowKey  the row key.
    277         * @param columnKey  the column key.
    278         */
    279        public void add(double mean, double standardDeviation,
    280                        Comparable rowKey, Comparable columnKey) {
    281            add(new Double(mean), new Double(standardDeviation), rowKey, columnKey);
    282        }
    283
    284        /**
    285         * Adds a mean and standard deviation to the table.
    286         *
    287         * @param mean  the mean.
    288         * @param standardDeviation  the standard deviation.
    289         * @param rowKey  the row key.
    290         * @param columnKey  the column key.
    291         */
    292        public void add(Number mean, Number standardDeviation,
    293                        Comparable rowKey, Comparable columnKey) {
    294            MeanAndStandardDeviation item = new MeanAndStandardDeviation(
    295                mean, standardDeviation
    296            );
    297            this.data.addObject(item, rowKey, columnKey);
    298            double m = 0.0;
    299            double sd = 0.0;
    300            if (mean != null) {
    301                m = mean.doubleValue();
    302            }
    303            if (standardDeviation != null) {
    304                sd = standardDeviation.doubleValue();
    305            }
    306
    307            if ((m + sd) > this.maximumRangeValue) {
    308                this.maximumRangeValue = m + sd;
    309                this.rangeBounds = new Range(
    310                    this.minimumRangeValue, this.maximumRangeValue
    311                );
    312            }
    313            if ((m - sd) < this.minimumRangeValue) {
    314                this.minimumRangeValue = m - sd;
    315                this.rangeBounds = new Range(
    316                    this.minimumRangeValue, this.maximumRangeValue
    317                );
    318            }
    319            fireDatasetChanged();
    320        }
    321
    322        /**
    323         * Returns the minimum y-value in the dataset.
    324         *
    325         * @param includeInterval  a flag that determines whether or not the
    326         *                         y-interval is taken into account (ignored for
    327         *                         this dataset).
    328         *
    329         * @return The minimum value.
    330         */
    331        public double getRangeLowerBound(boolean includeInterval) {
    332            return this.minimumRangeValue;
    333        }
    334
    335        /**
    336         * Returns the maximum y-value in the dataset.
    337         *
    338         * @param includeInterval  a flag that determines whether or not the
    339         *                         y-interval is taken into account (ignored for
    340         *                         this dataset).
    341         *
    342         * @return The maximum value.
    343         */
    344        public double getRangeUpperBound(boolean includeInterval) {
    345            return this.maximumRangeValue;
    346        }
    347
    348        /**
    349         * Returns the range of the values in this dataset's range.
    350         *
    351         * @param includeInterval  a flag that determines whether or not the
    352         *                         y-interval is taken into account.
    353         *
    354         * @return The range.
    355         */
    356        public Range getRangeBounds(boolean includeInterval) {
    357            return this.rangeBounds;
    358        }
    359
    360        /**
    361         * Tests this instance for equality with an arbitrary object.
    362         *
    363         * @param obj  the object (<code>null</code> permitted).
    364         *
    365         * @return A boolean.
    366         */
    367        public boolean equals(Object obj) {
    368            if (obj == this) {
    369                return true;
    370            }
    371            if (!(obj instanceof DefaultStatisticalCategoryDataset)) {
    372                return false;
    373            }
    374            DefaultStatisticalCategoryDataset that
    375                = (DefaultStatisticalCategoryDataset) obj;
    376            if (!this.data.equals(that.data)) {
    377                return false;
    378            }
    379            return true;
    380        }
    381    }